diff --git a/documentation/tutorials/getting-started-with-ash-admin.md b/documentation/tutorials/getting-started-with-ash-admin.md index 4ca6bda..5691a82 100644 --- a/documentation/tutorials/getting-started-with-ash-admin.md +++ b/documentation/tutorials/getting-started-with-ash-admin.md @@ -236,6 +236,11 @@ ash_admin "/admin", csp_nonce_assign_key: :csp_nonce_value This will allow AshAdmin-generated inline CSS and JS blocks to execute normally. +## Action Context + +AshAdmin adds `ash_admin?: true` to the context of all AshPhoenix forms it uses (read, update, and +generic actions). This allows upstream logic to know if an action is being called by AshAdmin. + ## Troubleshooting #### UI issues diff --git a/lib/ash_admin/components/resource/data_table.ex b/lib/ash_admin/components/resource/data_table.ex index a4f5fc7..b49a8f8 100644 --- a/lib/ash_admin/components/resource/data_table.ex +++ b/lib/ash_admin/components/resource/data_table.ex @@ -269,6 +269,7 @@ defmodule AshAdmin.Components.Resource.DataTable do else %{} end + |> Map.put(:ash_admin?, true) query = socket.assigns[:resource] diff --git a/lib/ash_admin/components/resource/form.ex b/lib/ash_admin/components/resource/form.ex index 16d485f..6809521 100644 --- a/lib/ash_admin/components/resource/form.ex +++ b/lib/ash_admin/components/resource/form.ex @@ -2743,40 +2743,29 @@ defmodule AshAdmin.Components.Resource.Form do include_non_map_types?: true ) + form_opts = [ + actor: socket.assigns[:actor], + authorize?: socket.assigns[:authorizing], + context: %{ash_admin?: true}, + domain: socket.assigns.domain, + forms: auto_forms, + tenant: socket.assigns[:tenant], + transform_errors: transform_errors + ] + form = case socket.assigns.action.type do :create -> socket.assigns.resource - |> AshPhoenix.Form.for_create(socket.assigns.action.name, - domain: socket.assigns.domain, - actor: socket.assigns[:actor], - authorize?: socket.assigns[:authorizing], - forms: auto_forms, - transform_errors: transform_errors, - tenant: socket.assigns[:tenant] - ) + |> AshPhoenix.Form.for_create(socket.assigns.action.name, form_opts) :update -> socket.assigns.record - |> AshPhoenix.Form.for_update(socket.assigns.action.name, - domain: socket.assigns.domain, - forms: auto_forms, - actor: socket.assigns[:actor], - authorize?: socket.assigns[:authorizing], - transform_errors: transform_errors, - tenant: socket.assigns[:tenant] - ) + |> AshPhoenix.Form.for_update(socket.assigns.action.name, form_opts) :destroy -> socket.assigns.record - |> AshPhoenix.Form.for_destroy(socket.assigns.action.name, - domain: socket.assigns.domain, - forms: auto_forms, - actor: socket.assigns[:actor], - authorize?: socket.assigns[:authorizing], - transform_errors: transform_errors, - tenant: socket.assigns[:tenant] - ) + |> AshPhoenix.Form.for_destroy(socket.assigns.action.name, form_opts) end assign(socket, :form, form |> to_form()) diff --git a/lib/ash_admin/components/resource/generic_action.ex b/lib/ash_admin/components/resource/generic_action.ex index 6a08f24..343c159 100644 --- a/lib/ash_admin/components/resource/generic_action.ex +++ b/lib/ash_admin/components/resource/generic_action.ex @@ -253,6 +253,7 @@ defmodule AshAdmin.Components.Resource.GenericAction do else %{} end + |> Map.put(:ash_admin?, true) form = AshPhoenix.Form.for_action(socket.assigns.resource, socket.assigns.action.name,