@@ -57,46 +57,70 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
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: [ ]
66-
67- data ->
68- List . wrap ( data )
69- end
70-
71- list_data
72- |> Enum . with_index ( )
73- |> Enum . map ( fn { data , i } ->
74- params =
75- case params do
60+ Map . get ( source_changeset . changes , field )
61+ |> case do
62+ nil ->
63+ case Map . get ( struct , field ) do
7664 nil ->
77- % { }
78-
79- params when is_list ( params ) ->
80- Enum . at ( params , i ) || % { }
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: [ ]
8168
82- params when is_map ( params ) ->
83- Map . get ( params , to_string ( i ) , % { } )
69+ data ->
70+ List . wrap ( data )
8471 end
8572
86- changeset =
73+ data when is_list ( data ) ->
8774 data
88- |> Ecto.Changeset . change ( )
89- |> apply_action ( parent_action )
9075
91- errors = get_errors ( changeset )
92-
93- changeset = % Ecto.Changeset {
94- changeset
95- | action: parent_action ,
96- params: params ,
97- errors: errors ,
98- valid?: errors == [ ]
99- }
76+ data ->
77+ List . wrap ( data )
78+ end
79+ |> 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 =
89+ case params do
90+ nil ->
91+ % { }
92+
93+ params when is_list ( params ) ->
94+ Enum . at ( params , i ) || % { }
95+
96+ params when is_map ( params ) ->
97+ Map . get ( params , to_string ( i ) , % { } )
98+ end
99+
100+ changeset =
101+ data
102+ |> Ecto.Changeset . change ( )
103+ |> apply_action ( parent_action )
104+
105+ errors = get_errors ( changeset )
106+
107+ changeset = % {
108+ changeset
109+ | action: parent_action ,
110+ params: params ,
111+ errors: errors ,
112+ valid?: errors == [ ]
113+ }
114+
115+ % { changeset: changeset , params: params , errors: errors , index: i }
116+ end )
117+ |> Enum . map ( fn prepared_data ->
118+ % {
119+ changeset: changeset ,
120+ params: params ,
121+ errors: errors ,
122+ index: i
123+ } = prepared_data
100124
101125 % schema { } = source_changeset . data
102126
@@ -116,7 +140,8 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
116140 name: if ( array? , do: name <> "[" <> index_string <> "]" , else: name ) ,
117141 index: if ( array? , do: i ) ,
118142 errors: errors ,
119- data: data ,
143+ data: changeset . data ,
144+ action: parent_action ,
120145 params: params ,
121146 hidden: [ { type_field_name , to_string ( type ) } ] ,
122147 options: options
0 commit comments