mirror of
https://github.com/ash-project/ash_phoenix.git
synced 2024-09-20 07:12:49 +12:00
improvement: add add_error/3
This commit is contained in:
parent
36df5a4b04
commit
0f3a0c7542
1 changed files with 49 additions and 4 deletions
|
@ -1757,13 +1757,13 @@ defmodule AshPhoenix.Form do
|
|||
if opts[:raise?] do
|
||||
raise Ash.Error.to_error_class(query.errors, query: query)
|
||||
else
|
||||
query = query || original_changeset_or_query
|
||||
|
||||
errors =
|
||||
error
|
||||
|> List.wrap()
|
||||
|> Enum.flat_map(&expand_error/1)
|
||||
|
||||
query = query || %{original_changeset_or_query | errors: errors}
|
||||
|
||||
{:error,
|
||||
set_action_errors(
|
||||
%{form | source: query},
|
||||
|
@ -1780,13 +1780,13 @@ defmodule AshPhoenix.Form do
|
|||
if opts[:raise?] do
|
||||
raise Ash.Error.to_error_class(changeset.errors, changeset: changeset)
|
||||
else
|
||||
changeset = changeset || original_changeset_or_query
|
||||
|
||||
errors =
|
||||
error
|
||||
|> List.wrap()
|
||||
|> Enum.flat_map(&expand_error/1)
|
||||
|
||||
changeset = changeset || %{original_changeset_or_query | errors: errors}
|
||||
|
||||
{:error,
|
||||
set_action_errors(
|
||||
%{form | source: changeset},
|
||||
|
@ -2761,6 +2761,51 @@ defmodule AshPhoenix.Form do
|
|||
]
|
||||
]
|
||||
|
||||
@doc """
|
||||
Adds an error to the source underlying the form.
|
||||
|
||||
This can be used for adding errors from different sources to a form. Keep in mind, if they don't match
|
||||
a field on the form (typically extracted via the `field` key in the error), they won't be displayed by default.
|
||||
|
||||
# Options
|
||||
|
||||
- `:path` - The path to add the error to. If the error(s) already have a path, don't specify a path yourself.
|
||||
"""
|
||||
def add_error(form, path, opts \\ [])
|
||||
|
||||
def add_error(%Phoenix.HTML.Form{} = form, path, opts) do
|
||||
form.source
|
||||
|> add_error(path, opts)
|
||||
|> Phoenix.HTML.FormData.to_form(form.options)
|
||||
end
|
||||
|
||||
def add_error(form, error, opts) do
|
||||
error = Ash.Error.to_error_class(error)
|
||||
|
||||
error =
|
||||
if opts[:path] do
|
||||
Ash.Error.set_path(error, opts[:path])
|
||||
else
|
||||
error
|
||||
end
|
||||
|
||||
new_source =
|
||||
case form.source do
|
||||
%Ash.Query{} ->
|
||||
Ash.Query.add_error(form.source, error)
|
||||
|
||||
%Ash.Changeset{} ->
|
||||
Ash.Changeset.add_error(form.source, error)
|
||||
|
||||
%Ash.ActionInput{} ->
|
||||
Ash.ActionInput.add_error(form.source, error)
|
||||
end
|
||||
|
||||
%{form | source: new_source}
|
||||
|> set_validity()
|
||||
|> carry_over_errors()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Adds a new form at the provided path.
|
||||
|
||||
|
|
Loading…
Reference in a new issue