Skip to content

Commit fb46fe6

Browse files
committed
fix: keep data from source_changeset
1 parent 9ce3703 commit fb46fe6

1 file changed

Lines changed: 49 additions & 26 deletions

File tree

lib/polymorphic_embed/html/helpers.ex

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,45 +49,68 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
4949
form.source.data.__struct__
5050
end
5151

52-
def to_form(%{action: parent_action} = source_changeset, form, field, options) do
52+
def to_form(source_changeset, %{action: parent_action} = form, field, options) do
5353
id = to_string(form.id <> "_#{field}")
5454
name = to_string(form.name <> "[#{field}]")
5555

5656
params = Map.get(source_changeset.params || %{}, to_string(field), %{}) |> List.wrap()
5757

5858
struct = Ecto.Changeset.apply_changes(source_changeset)
5959

60-
list_data =
61-
case Map.get(struct, field) do
62-
nil ->
63-
type = Keyword.get(options, :polymorphic_type, get_polymorphic_type(form, field))
64-
module = PolymorphicEmbed.get_polymorphic_module(struct.__struct__, field, type)
65-
if module, do: [struct(module)], else: []
60+
Map.get(source_changeset.changes, field)
61+
|> case do
62+
nil ->
63+
case Map.get(struct, field) do
64+
nil ->
65+
type = Keyword.get(options, :polymorphic_type, get_polymorphic_type(form, field))
66+
module = PolymorphicEmbed.get_polymorphic_module(struct.__struct__, field, type)
67+
if module, do: [struct(module)], else: []
6668

67-
data ->
68-
List.wrap(data)
69-
end
69+
data ->
70+
List.wrap(data)
71+
end
7072

71-
list_data
73+
data when is_list(data) ->
74+
data
75+
76+
data ->
77+
List.wrap(data)
78+
end
7279
|> Enum.with_index()
73-
|> Enum.map(fn {data, i} ->
74-
params = Enum.at(params, i) || %{}
80+
|> Enum.map(fn
81+
{%Ecto.Changeset{} = changeset, i} ->
82+
params = changeset.params || %{}
83+
errors = get_errors(changeset)
84+
85+
%{changeset: changeset, params: params, errors: errors, index: i}
86+
87+
{data, i} ->
88+
params = Enum.at(params, i) || %{}
7589

76-
%Ecto.Changeset{} =
7790
changeset =
78-
data
79-
|> Ecto.Changeset.change()
80-
|> apply_action(parent_action)
91+
data
92+
|> Ecto.Changeset.change()
93+
|> apply_action(parent_action)
8194

82-
errors = get_errors(changeset)
95+
errors = get_errors(changeset)
8396

84-
changeset = %Ecto.Changeset{
85-
changeset
86-
| action: parent_action,
87-
params: params,
88-
errors: errors,
89-
valid?: errors == []
90-
}
97+
changeset = %{
98+
changeset
99+
| action: parent_action,
100+
params: params,
101+
errors: errors,
102+
valid?: errors == []
103+
}
104+
105+
%{changeset: changeset, params: params, errors: errors, index: i}
106+
end)
107+
|> Enum.map(fn prepared_data ->
108+
%{
109+
changeset: changeset,
110+
params: params,
111+
errors: errors,
112+
index: i
113+
} = prepared_data
91114

92115
%schema{} = source_changeset.data
93116

@@ -107,7 +130,7 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
107130
name: if(array?, do: name <> "[" <> index_string <> "]", else: name),
108131
index: if(array?, do: i),
109132
errors: errors,
110-
data: data,
133+
data: changeset.data,
111134
action: parent_action,
112135
params: params,
113136
hidden: [{type_field_name, to_string(type)}],

0 commit comments

Comments
 (0)