mirror of
https://github.com/ash-project/ash_admin.git
synced 2024-09-20 05:12:54 +12:00
improvement: support value-backed nested forms
This commit is contained in:
parent
9894b14839
commit
40ea12b3f4
1 changed files with 40 additions and 30 deletions
|
@ -227,6 +227,25 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
argument,
|
argument,
|
||||||
opts
|
opts
|
||||||
) do
|
) do
|
||||||
|
key =
|
||||||
|
opts[:value_is_key] ||
|
||||||
|
relationship.destination
|
||||||
|
|> Ash.Resource.Info.primary_key()
|
||||||
|
|> case do
|
||||||
|
[key] ->
|
||||||
|
key
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
{hidden?, exactly_fields} =
|
||||||
|
if map_type?(argument.type) || !key do
|
||||||
|
{true, nil}
|
||||||
|
else
|
||||||
|
{false, [key]}
|
||||||
|
end
|
||||||
|
|
||||||
~F"""
|
~F"""
|
||||||
<div :if={!must_load?(opts) || loaded?(form.source.source, relationship.name)}>
|
<div :if={!must_load?(opts) || loaded?(form.source.source, relationship.name)}>
|
||||||
<Inputs
|
<Inputs
|
||||||
|
@ -246,21 +265,25 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<input :for={kv <- inner_form.hidden} name={inner_form.name <> "[#{elem(kv, 0)}]"} value={elem(kv, 1)} hidden>
|
{#if hidden?}
|
||||||
|
<input :for={kv <- inner_form.hidden} name={inner_form.name <> "[#{elem(kv, 0)}]"} value={elem(kv, 1)} hidden>
|
||||||
|
{/if}
|
||||||
{#if inner_form.source.form_keys[:_join]}
|
{#if inner_form.source.form_keys[:_join]}
|
||||||
<Inputs
|
<Inputs
|
||||||
form={inner_form}
|
form={inner_form}
|
||||||
for={:_join}
|
for={:_join}
|
||||||
:let={form: join_form}
|
:let={form: join_form}
|
||||||
>
|
>
|
||||||
<input :for={kv <- join_form.hidden} name={inner_form.name <> "[#{elem(kv, 0)}]"} value={elem(kv, 1)} hidden>
|
{#if hidden?}
|
||||||
|
<input :for={kv <- join_form.hidden} name={inner_form.name <> "[#{elem(kv, 0)}]"} value={elem(kv, 1)} hidden>
|
||||||
|
{/if}
|
||||||
{render_attributes(
|
{render_attributes(
|
||||||
assigns,
|
assigns,
|
||||||
relationship.through,
|
relationship.through,
|
||||||
join_action(relationship.through, join_form, inner_form.source.form_keys[:_join]),
|
join_action(relationship.through, join_form, inner_form.source.form_keys[:_join]),
|
||||||
join_form,
|
join_form,
|
||||||
inner_form.source.form_keys[:_join][:create_fields],
|
exactly_fields || inner_form.source.form_keys[:_join][:create_fields],
|
||||||
skip_through_related(relationship)
|
skip_through_related(exactly_fields, relationship)
|
||||||
)}
|
)}
|
||||||
</Inputs>
|
</Inputs>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -269,8 +292,8 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
inner_form.source.resource,
|
inner_form.source.resource,
|
||||||
inner_form.source.source.action,
|
inner_form.source.source.action,
|
||||||
inner_form,
|
inner_form,
|
||||||
relationship_fields(inner_form),
|
exactly_fields || relationship_fields(inner_form),
|
||||||
skip_related(relationship)
|
skip_related(exactly_fields, relationship)
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
@ -390,7 +413,7 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp skip_related(relationship) do
|
defp skip_related(nil, relationship) do
|
||||||
case relationship.type do
|
case relationship.type do
|
||||||
:belongs_to ->
|
:belongs_to ->
|
||||||
[]
|
[]
|
||||||
|
@ -400,14 +423,22 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp skip_related(_, _) do
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
defp must_load?(opts) do
|
defp must_load?(opts) do
|
||||||
Ash.Changeset.ManagedRelationshipHelpers.must_load?(opts)
|
Ash.Changeset.ManagedRelationshipHelpers.must_load?(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp skip_through_related(relationship) do
|
defp skip_through_related(nil, relationship) do
|
||||||
[relationship.source_field_on_join_table, relationship.destination_field_on_join_table]
|
[relationship.source_field_on_join_table, relationship.destination_field_on_join_table]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp skip_through_related(_, _) do
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
defp loaded?(%{action_type: :create}, _), do: true
|
defp loaded?(%{action_type: :create}, _), do: true
|
||||||
|
|
||||||
defp loaded?(%{data: record}, relationship) do
|
defp loaded?(%{data: record}, relationship) do
|
||||||
|
@ -1011,27 +1042,6 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
|> assign(:form, form)}
|
|> assign(:form, form)}
|
||||||
end
|
end
|
||||||
|
|
||||||
# path_to_load = AshPhoenix.Form.parse_path!(socket.assigns.form, path) ++ [relationship]
|
|
||||||
# form = socket.assigns.form
|
|
||||||
|
|
||||||
# new_data =
|
|
||||||
# socket.assigns.api.load!(form.data, path_to_load,
|
|
||||||
# actor: socket.assigns[:actor],
|
|
||||||
# authorize?: socket.assigns[:authorizing],
|
|
||||||
# lazy?: true
|
|
||||||
# )
|
|
||||||
|
|
||||||
# new_source =
|
|
||||||
# if Map.has_key?(form.source, :data) do
|
|
||||||
# %{form.source | data: new_data}
|
|
||||||
# else
|
|
||||||
# form.source
|
|
||||||
# end
|
|
||||||
|
|
||||||
# form =
|
|
||||||
# %{form | data: new_data, source: new_source}
|
|
||||||
# |> AshPhoenix.Form.validate(AshPhoenix.Form.params(form), errors: false)
|
|
||||||
|
|
||||||
def handle_event("remove_value", %{"path" => path, "field" => field, "index" => index}, socket) do
|
def handle_event("remove_value", %{"path" => path, "field" => field, "index" => index}, socket) do
|
||||||
form =
|
form =
|
||||||
AshPhoenix.Form.update_form(
|
AshPhoenix.Form.update_form(
|
||||||
|
@ -1240,7 +1250,7 @@ defmodule AshAdmin.Components.Resource.Form do
|
||||||
attributes
|
attributes
|
||||||
|> Enum.map(fn
|
|> Enum.map(fn
|
||||||
%Ash.Resource.Actions.Argument{} = argument ->
|
%Ash.Resource.Actions.Argument{} = argument ->
|
||||||
if action && map_type?(argument.type) do
|
if action do
|
||||||
case manages_relationship(argument, action) do
|
case manages_relationship(argument, action) do
|
||||||
nil ->
|
nil ->
|
||||||
argument
|
argument
|
||||||
|
|
Loading…
Reference in a new issue