@@ -653,6 +653,12 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
653653 end )
654654 end
655655
656+ def handle_call ( { :get_lazy , % Element { } = element } , _from , state ) do
657+ view = fetch_view_by_topic! ( state , proxy_topic ( element ) )
658+ { state , root } = root ( state , view . id )
659+ { :reply , { :ok , root } , state }
660+ end
661+
656662 def handle_call ( { :get_lazy , id } , _from , state ) do
657663 { state , root } = root ( state , id )
658664 { :reply , { :ok , root } , state }
@@ -1242,41 +1248,29 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
12421248
12431249 defp maybe_values ( :hook , _root , _node , _element ) , do: { :ok , % { } }
12441250
1245- defp maybe_values ( type , root , { tag , attrs , _ } = node , element )
1251+ defp maybe_values ( type , root , { tag , _ , _ } = node , element )
12461252 when type in [ :change , :submit ] do
12471253 cond do
12481254 tag == "form" ->
1249- form_inputs = filtered_inputs ( node )
1250-
1251- { value_inputs , lazy_submitter } =
1252- case Enum . into ( attrs , % { } ) do
1253- % { "id" => id } ->
1254- by_form_id = DOM . all ( root , ~s< [form="#{ id } "]> ) |> DOM . to_tree ( )
1255- named_inputs = filtered_inputs ( by_form_id )
1256-
1257- # All inputs including buttons
1258- # Remove the named inputs first to remove any possible
1259- # duplicates if the child inputs also had a form attribite.
1260- value_inputs = ( form_inputs -- named_inputs ) ++ named_inputs
1261-
1262- { value_inputs ,
1263- fn ->
1264- # a lazy function that returns a lazy node with all form inputs
1265- # that could be the submitter to collect the submitter by selector
1266- DOM . all ( root , ~s<
1267- ##{ id } :is(input, button):not([form]:not([form="#{ id } "])),
1268- :is(input, button)[form="#{ id } "]
1269- > )
1270- end }
1271-
1272- _ ->
1255+ value_inputs = DOM . all_value_inputs ( node , root )
1256+ defaults = DOM . collect_form_values ( node , root , fn defaults -> defaults end )
1257+
1258+ lazy_submitter =
1259+ case TreeDOM . attribute ( node , "id" ) do
1260+ nil ->
12731261 # to collect the submitter by selector,
12741262 # need to convert the tree to a lazy here :(
1275- { form_inputs , fn -> DOM . to_lazy ( [ node ] ) end }
1263+ fn -> DOM . to_lazy ( [ node ] ) end
1264+
1265+ id ->
1266+ # a lazy function that returns a lazy node with all form inputs
1267+ # that could be the submitter to collect the submitter by selector
1268+ fn -> DOM . all ( root , ~s<
1269+ ##{ id } :is(input, button):not([form]:not([form="#{ id } "])),
1270+ :is(input, button)[form="#{ id } "]
1271+ > ) end
12761272 end
12771273
1278- defaults = Enum . reduce ( value_inputs , Query . decode_init ( ) , & form_defaults / 2 )
1279-
12801274 with { :ok , defaults } <-
12811275 maybe_submitter ( defaults , type , lazy_submitter , element ) ,
12821276 { :ok , value } <-
@@ -1291,7 +1285,7 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
12911285 end
12921286
12931287 type == :change and tag in ~w( input select textarea) ->
1294- { :ok , form_defaults ( node , Query . decode_init ( ) ) |> Query . decode_done ( ) }
1288+ { :ok , DOM . collect_input_values ( node ) }
12951289
12961290 true ->
12971291 { :error , :invalid , "phx-#{ type } is only allowed in forms, got #{ inspect ( tag ) } " }
@@ -1308,13 +1302,6 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
13081302 defp deep_merge ( _target , source ) ,
13091303 do: source
13101304
1311- defp filtered_inputs ( nodes ) do
1312- TreeDOM . filter ( nodes , fn node ->
1313- TreeDOM . tag ( node ) in ~w( input textarea select) and
1314- is_nil ( TreeDOM . attribute ( node , "disabled" ) )
1315- end )
1316- end
1317-
13181305 defp maybe_submitter ( defaults , :submit , lazy , % Element { meta: % { submitter: element } } ) do
13191306 base = lazy . ( )
13201307
@@ -1394,81 +1381,6 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
13941381 end
13951382 end
13961383
1397- defp form_defaults ( node , acc ) do
1398- tag = TreeDOM . tag ( node )
1399-
1400- if name = TreeDOM . attribute ( node , "name" ) do
1401- form_defaults ( tag , node , name , acc )
1402- else
1403- acc
1404- end
1405- end
1406-
1407- # Selectedness algorithm as outlined in
1408- # https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element
1409- defp form_defaults ( "select" , node , name , acc ) do
1410- options = TreeDOM . filter ( node , & ( TreeDOM . tag ( & 1 ) == "option" ) )
1411-
1412- multiple_display_size =
1413- case valid_display_size ( node ) do
1414- int when is_integer ( int ) and int > 1 -> true
1415- _ -> false
1416- end
1417-
1418- all_selected =
1419- if TreeDOM . attribute ( node , "multiple" ) || multiple_display_size do
1420- Enum . filter ( options , & TreeDOM . attribute ( & 1 , "selected" ) )
1421- else
1422- List . wrap (
1423- Enum . find ( Enum . reverse ( options ) , & TreeDOM . attribute ( & 1 , "selected" ) ) ||
1424- Enum . find ( options , & ( ! TreeDOM . attribute ( & 1 , "disabled" ) ) )
1425- )
1426- end
1427-
1428- Enum . reduce ( all_selected , acc , fn selected , acc ->
1429- Plug.Conn.Query . decode_each ( { name , TreeDOM . attribute ( selected , "value" ) } , acc )
1430- end )
1431- end
1432-
1433- defp form_defaults ( "textarea" , node , name , acc ) do
1434- value = TreeDOM . to_text ( node , false )
1435-
1436- if value == "" do
1437- Plug.Conn.Query . decode_each ( { name , "" } , acc )
1438- else
1439- Plug.Conn.Query . decode_each ( { name , String . replace_prefix ( value , "\n " , "" ) } , acc )
1440- end
1441- end
1442-
1443- defp form_defaults ( "input" , node , name , acc ) do
1444- type = TreeDOM . attribute ( node , "type" ) || "text"
1445- value = TreeDOM . attribute ( node , "value" ) || default_value ( type )
1446-
1447- cond do
1448- type in [ "radio" , "checkbox" ] ->
1449- if TreeDOM . attribute ( node , "checked" ) do
1450- Plug.Conn.Query . decode_each ( { name , value } , acc )
1451- else
1452- acc
1453- end
1454-
1455- type in [ "image" , "submit" ] ->
1456- acc
1457-
1458- true ->
1459- Plug.Conn.Query . decode_each ( { name , value } , acc )
1460- end
1461- end
1462-
1463- defp valid_display_size ( node ) do
1464- with size when not is_nil ( size ) <- TreeDOM . attribute ( node , "size" ) ,
1465- { int , "" } when int > 0 <- Integer . parse ( size ) do
1466- int
1467- else
1468- _ -> nil
1469- end
1470- end
1471-
14721384 defp fill_in_map ( [ { key , value } | rest ] , prefix , node , acc ) do
14731385 key = to_string ( key )
14741386
@@ -1568,7 +1480,7 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
15681480 type = TreeDOM . attribute ( node , "type" ) || "text"
15691481
15701482 if type in [ "radio" , "checkbox" , "hidden" ] do
1571- value = TreeDOM . attribute ( node , "value" ) || default_value ( type )
1483+ value = TreeDOM . attribute ( node , "value" ) || DOM . default_value ( type )
15721484 { [ type | types ] , [ value | values ] }
15731485 else
15741486 { [ type | types ] , values }
@@ -1592,9 +1504,6 @@ defmodule Phoenix.LiveViewTest.ClientProxy do
15921504 { types , values }
15931505 end
15941506
1595- defp default_value ( "checkbox" ) , do: "on"
1596- defp default_value ( _type ) , do: ""
1597-
15981507 defp fill_in_name ( "" , name ) , do: name
15991508 defp fill_in_name ( prefix , name ) , do: prefix <> "[" <> name <> "]"
16001509
0 commit comments