mirror of
https://github.com/ash-project/ash_phoenix.git
synced 2024-09-20 07:12:49 +12:00
fix: handle read_actions with data
This commit is contained in:
parent
82933c6bfa
commit
c7bf6ee272
1 changed files with 106 additions and 49 deletions
|
@ -2478,63 +2478,120 @@ defmodule AshPhoenix.Form do
|
|||
transform_errors
|
||||
) do
|
||||
if Keyword.has_key?(opts, :data) do
|
||||
update_action =
|
||||
opts[:update_action] ||
|
||||
raise AshPhoenix.Form.NoActionConfigured,
|
||||
path: Enum.reverse(trail, [key]),
|
||||
action: :update
|
||||
cond do
|
||||
opts[:update_action] ->
|
||||
update_action = opts[:update_action]
|
||||
|
||||
data =
|
||||
if opts[:data] do
|
||||
if is_function(opts[:data]) do
|
||||
if Enum.at(prev_data_trail, 0) do
|
||||
case call_data(opts[:data], prev_data_trail) do
|
||||
%Ash.NotLoaded{} ->
|
||||
raise AshPhoenix.Form.NoDataLoaded,
|
||||
path: Enum.reverse(trail, [key])
|
||||
data =
|
||||
if opts[:data] do
|
||||
if is_function(opts[:data]) do
|
||||
if Enum.at(prev_data_trail, 0) do
|
||||
case call_data(opts[:data], prev_data_trail) do
|
||||
%Ash.NotLoaded{} ->
|
||||
raise AshPhoenix.Form.NoDataLoaded,
|
||||
path: Enum.reverse(trail, [key])
|
||||
|
||||
other ->
|
||||
other
|
||||
other ->
|
||||
other
|
||||
end
|
||||
else
|
||||
nil
|
||||
end
|
||||
else
|
||||
opts[:data]
|
||||
end
|
||||
else
|
||||
nil
|
||||
end
|
||||
else
|
||||
opts[:data]
|
||||
end
|
||||
end
|
||||
|
||||
if data do
|
||||
form_values =
|
||||
if (opts[:type] || :single) == :single do
|
||||
for_action(data, update_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
manage_relationship_source: manage_relationship_source(source_changeset, opts),
|
||||
transform_errors: transform_errors,
|
||||
as: name <> "[#{key}]",
|
||||
id: id <> "_#{key}"
|
||||
)
|
||||
if data do
|
||||
form_values =
|
||||
if (opts[:type] || :single) == :single do
|
||||
for_action(data, update_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
manage_relationship_source: manage_relationship_source(source_changeset, opts),
|
||||
transform_errors: transform_errors,
|
||||
as: name <> "[#{key}]",
|
||||
id: id <> "_#{key}"
|
||||
)
|
||||
else
|
||||
data
|
||||
|> Enum.with_index()
|
||||
|> Enum.map(fn {data, index} ->
|
||||
for_action(data, update_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
transform_errors: transform_errors,
|
||||
manage_relationship_source:
|
||||
manage_relationship_source(source_changeset, opts),
|
||||
as: name <> "[#{key}][#{index}]",
|
||||
id: id <> "_#{key}_#{index}"
|
||||
)
|
||||
end)
|
||||
end
|
||||
|
||||
{Map.put(forms, key, form_values), params}
|
||||
else
|
||||
data
|
||||
|> Enum.with_index()
|
||||
|> Enum.map(fn {data, index} ->
|
||||
for_action(data, update_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
transform_errors: transform_errors,
|
||||
manage_relationship_source: manage_relationship_source(source_changeset, opts),
|
||||
as: name <> "[#{key}][#{index}]",
|
||||
id: id <> "_#{key}_#{index}"
|
||||
)
|
||||
end)
|
||||
{forms, params}
|
||||
end
|
||||
|
||||
{Map.put(forms, key, form_values), params}
|
||||
else
|
||||
{forms, params}
|
||||
opts[:read_action] ->
|
||||
read_action = opts[:read_action]
|
||||
|
||||
data =
|
||||
if opts[:data] do
|
||||
if is_function(opts[:data]) do
|
||||
if Enum.at(prev_data_trail, 0) do
|
||||
case call_data(opts[:data], prev_data_trail) do
|
||||
%Ash.NotLoaded{} ->
|
||||
raise AshPhoenix.Form.NoDataLoaded,
|
||||
path: Enum.reverse(trail, [key])
|
||||
|
||||
other ->
|
||||
other
|
||||
end
|
||||
else
|
||||
nil
|
||||
end
|
||||
else
|
||||
opts[:data]
|
||||
end
|
||||
end
|
||||
|
||||
if data do
|
||||
form_values =
|
||||
if (opts[:type] || :single) == :single do
|
||||
for_action(data, read_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
manage_relationship_source: manage_relationship_source(source_changeset, opts),
|
||||
transform_errors: transform_errors,
|
||||
as: name <> "[#{key}]",
|
||||
id: id <> "_#{key}"
|
||||
)
|
||||
else
|
||||
data
|
||||
|> Enum.with_index()
|
||||
|> Enum.map(fn {data, index} ->
|
||||
for_action(data, read_action,
|
||||
errors: error?,
|
||||
prev_data_trail: prev_data_trail,
|
||||
forms: opts[:forms] || [],
|
||||
transform_errors: transform_errors,
|
||||
manage_relationship_source:
|
||||
manage_relationship_source(source_changeset, opts),
|
||||
as: name <> "[#{key}][#{index}]",
|
||||
id: id <> "_#{key}_#{index}"
|
||||
)
|
||||
end)
|
||||
end
|
||||
|
||||
{Map.put(forms, key, form_values), params}
|
||||
else
|
||||
{forms, params}
|
||||
end
|
||||
end
|
||||
else
|
||||
{forms, params}
|
||||
|
|
Loading…
Reference in a new issue