Skip to content

Commit b74f402

Browse files
committed
refactor extracting data and preparing changeset
1 parent fb46fe6 commit b74f402

1 file changed

Lines changed: 48 additions & 46 deletions

File tree

lib/polymorphic_embed/html/helpers.ex

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -57,53 +57,9 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
5757

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

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: []
68-
69-
data ->
70-
List.wrap(data)
71-
end
72-
73-
data when is_list(data) ->
74-
data
75-
76-
data ->
77-
List.wrap(data)
78-
end
60+
resolve_field_data(source_changeset, struct, form, field, options)
7961
|> Enum.with_index()
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) || %{}
89-
90-
changeset =
91-
data
92-
|> Ecto.Changeset.change()
93-
|> apply_action(parent_action)
94-
95-
errors = get_errors(changeset)
96-
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)
62+
|> Enum.map(&prepare_changeset(&1, params, parent_action))
10763
|> Enum.map(fn prepared_data ->
10864
%{
10965
changeset: changeset,
@@ -139,6 +95,52 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
13995
end)
14096
end
14197

98+
defp resolve_field_data(source_changeset, struct, form, field, options) do
99+
case Map.get(source_changeset.changes, field) do
100+
nil ->
101+
case Map.get(struct, field) do
102+
nil ->
103+
type = Keyword.get(options, :polymorphic_type, get_polymorphic_type(form, field))
104+
module = PolymorphicEmbed.get_polymorphic_module(struct.__struct__, field, type)
105+
if module, do: [struct(module)], else: []
106+
107+
data ->
108+
List.wrap(data)
109+
end
110+
111+
data ->
112+
List.wrap(data)
113+
end
114+
end
115+
116+
defp prepare_changeset({%Ecto.Changeset{} = changeset, i}, _params, _parent_action) do
117+
params = changeset.params || %{}
118+
errors = get_errors(changeset)
119+
120+
%{changeset: changeset, params: params, errors: errors, index: i}
121+
end
122+
123+
defp prepare_changeset({data, i}, params, parent_action) do
124+
params = Enum.at(params, i) || %{}
125+
126+
changeset =
127+
data
128+
|> Ecto.Changeset.change()
129+
|> apply_action(parent_action)
130+
131+
errors = get_errors(changeset)
132+
133+
changeset = %Ecto.Changeset{
134+
changeset
135+
| action: parent_action,
136+
params: params,
137+
errors: errors,
138+
valid?: errors == []
139+
}
140+
141+
%{changeset: changeset, params: params, errors: errors, index: i}
142+
end
143+
142144
# If the parent changeset had no action, we need to remove the action
143145
# from children changeset so we ignore all errors accordingly.
144146
defp apply_action(changeset, nil), do: %{changeset | action: nil}

0 commit comments

Comments
 (0)