@@ -53,50 +53,64 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
5353 id = to_string ( form . id <> "_#{ field } " )
5454 name = to_string ( form . name <> "[#{ field } ]" )
5555
56- params = Map . get ( source_changeset . params || % { } , to_string ( field ) , % { } )
56+ 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 =
75- case params do
76- nil ->
77- % { }
80+ |> Enum . map ( fn
81+ { % Ecto.Changeset { } = changeset , i } ->
82+ params = changeset . params || % { }
83+ errors = get_errors ( changeset )
7884
79- params when is_list ( params ) ->
80- Enum . at ( params , i ) || % { }
85+ % { changeset: changeset , params: params , errors: errors , index: i }
8186
82- params when is_map ( params ) ->
83- Map . get ( params , to_string ( i ) , % { } )
84- end
87+ { data , i } ->
88+ params = Enum . at ( params , i ) || % { }
8589
86- changeset =
87- data
88- |> Ecto.Changeset . change ( )
89- |> apply_action ( parent_action )
90+ changeset =
91+ data
92+ |> Ecto.Changeset . change ( )
93+ |> apply_action ( parent_action )
9094
91- errors = get_errors ( changeset )
95+ errors = get_errors ( changeset )
9296
93- changeset = % Ecto.Changeset {
94- changeset
95- | action: parent_action ,
96- params: params ,
97- errors: errors ,
98- valid?: errors == [ ]
99- }
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
100114
101115 % schema { } = source_changeset . data
102116
@@ -116,7 +130,8 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
116130 name: if ( array? , do: name <> "[" <> index_string <> "]" , else: name ) ,
117131 index: if ( array? , do: i ) ,
118132 errors: errors ,
119- data: data ,
133+ data: changeset . data ,
134+ action: parent_action ,
120135 params: params ,
121136 hidden: [ { type_field_name , to_string ( type ) } ] ,
122137 options: options
0 commit comments