@@ -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