View Source Resource Actions
Resource actions are a way to define custom actions that can be performed on a whole resource.
A resource action could be something like exporting a resource to a CSV file, or sending an email to all users in a resource.
Configuration
You define resource actions by implementing the resource_actions/0
callback in your resource configuration module.
Let's say you have a resource called User
and you want to add a resource action to invite users to your application.
First, you need to add the resource action to your resource configuration module.
# in your resource configuration file
@impl Backpex.LiveResource
def resource_actions() do
[
invite: %{
module: MyWebApp.Admin.ResourceActions.Invite,
}
]
end
Each resource action is a map with at least the module key. The module key should point to the module that implements the resource action. The key in the keyword list is the unique id
of the resource action.
Implementing a Resource Action
A resource action is a module that uses the Backpex.ResourceAction
module.
defmodule MyAppWeb.Admin.Actions.Invite do
use Backpex.ResourceAction
import Ecto.Changeset
@impl Backpex.ResourceAction
def label, do: "Invite"
@impl Backpex.ResourceAction
def title, do: "Invite user"
# you can reuse Backpex fields in the field definition
@impl Backpex.ResourceAction
def fields do
[
email: %{
module: Backpex.Fields.Text,
label: "Email",
type: :string
}
]
end
@impl Backpex.ResourceAction
def changeset(change, attrs) do
change
|> cast(attrs, [:email])
|> validate_required([:email])
|> validate_email(:email)
end
@impl Backpex.ResourceAction
def handle(_socket, data) do
# Send mail
# We suppose there was no error.
if true do
{:ok, "An invitation email to #{data.email} was sent successfully."}
else
{:error, "An error occurred while sending an invitation email to #{data.email}!"}
end
end
end
See Backpex.ResourceAction
for a documentation of the callbacks.
The handle/2
callback is called when the user submits the form to perform the action. In this example, we suppose there was no error sending the invitation email and return a success message.
You can access the email entered by the user in the data
argument. The data
argument is a map that contains the casted and validated data from the form (received from Ecto.Changeset.apply_action/2
).
We validate the email address using the validate_email/2
function provided by the Ecto.Changeset
module.
Info
Each resource action has its own route. The route is defined by the id
of the resource action. If you use the live_resource/3
macro, the route is automatically added to the live resource.