actions docs

This commit is contained in:
Dan Harrin
2025-03-31 11:02:05 +01:00
parent afc5310275
commit da2cc6d0e5
24 changed files with 385 additions and 365 deletions
+1 -1
View File
@@ -254,7 +254,7 @@ class CreateCategory extends CreateRecord
}
```
Inside the `getSteps()` array, return your [wizard steps](../../schemas/layouts/wizard):
Inside the `getSteps()` array, return your [wizard steps](../../schemas/wizards):
```php
use Filament\Forms\Components\MarkdownEditor;
+1 -1
View File
@@ -180,7 +180,7 @@ Alternatively, if you're editing records in a modal action, check out the [Actio
## Saving a part of the form independently
You may want to allow the user to save a part of the form independently of the rest of the form. One way to do this is with a [section action in the header or footer](../../schemas/layouts/section#adding-actions-to-the-sections-header-or-footer). From the `action()` method, you can call `saveFormComponentOnly()`, passing in the `Section` component that you want to save:
You may want to allow the user to save a part of the form independently of the rest of the form. One way to do this is with a [section action in the header or footer](../../schemas/sections#adding-actions-to-the-sections-header-or-footer). From the `action()` method, you can call `saveFormComponentOnly()`, passing in the `Section` component that you want to save:
```php
use Filament\Actions\Action;
+3 -3
View File
@@ -32,7 +32,7 @@ From a UX perspective, this solution is only suitable if your related model only
> These are compatible with `BelongsTo`, `HasOne` and `MorphOne` relationships.
All layout form components ([Grid](../../schemas/layouts/grid#grid-component), [Section](../../schemas/layouts/section), [Fieldset](../../schemas/layouts/fieldset), etc.) have a [`relationship()` method](../../forms/advanced#saving-data-to-relationships). When you use this, all fields within that layout are saved to the related model instead of the owner's model:
All layout form components ([Grid](../../schemas/layouts#grid-component), [Section](../../schemas/sections), [Fieldset](../../schemas/layouts#fieldset-component), etc.) have a [`relationship()` method](../../forms/advanced#saving-data-to-relationships). When you use this, all fields within that layout are saved to the related model instead of the owner's model:
```php
use Filament\Forms\Components\FileUpload;
@@ -656,7 +656,7 @@ public function hasCombinedRelationManagerTabsWithContent(): bool
### Customizing the content tab
On the Edit or View page class, override the `getContentTabComponent()` method, and use any [Tab](../../schemas/layouts/tabs) customization methods:
On the Edit or View page class, override the `getContentTabComponent()` method, and use any [Tab](../../schemas/tabs) customization methods:
```php
use Filament\Schemas\Components\Tabs\Tab;
@@ -683,7 +683,7 @@ public function getContentTabPosition(): ?ContentTabPosition
## Customizing relation manager tabs
To customize the tab for a relation manager, override the `getTabComponent()` method, and use any [Tab](../../schemas/layouts/tabs) customization methods:
To customize the tab for a relation manager, override the `getTabComponent()` method, and use any [Tab](../../schemas/tabs) customization methods:
```php
use Filament\Schemas\Components\Tabs\Tab;
+1 -1
View File
@@ -478,7 +478,7 @@ These injected utilities require specific parameter names to be used. Otherwise,
### Injecting the current modal form data
If you wish to access the current [modal form data](modals#modal-forms), define a `$data` parameter:
If you wish to access the current [modal form data](modals#rendering-a-form-in-a-modal), define a `$data` parameter:
```php
function (array $data) {
+186 -114
View File
@@ -1,7 +1,9 @@
---
title: Modals
---
import Aside from "@components/Aside.astro"
import AutoScreenshot from "@components/AutoScreenshot.astro"
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -22,13 +24,72 @@ Action::make('delete')
<AutoScreenshot name="actions/modal/confirmation" alt="Confirmation modal" version="4.x" />
> The confirmation modal is not available when a `url()` is set instead of an `action()`. Instead, you should redirect to the URL within the `action()` closure.
<Aside variant="warning">
The confirmation modal is not available when a `url()` is set instead of an `action()`. Instead, you should redirect to the URL within the `action()` closure.
</Aside>
## Modal forms
## Controlling modal content
You may also render a form in the modal to collect extra information from the user before the action runs.
### Customizing the modal's heading, description, and submit action label
You may use components from the [Form Builder](../forms) to create custom action modal forms. The data from the form is available in the `$data` array of the `action()` closure:
You may customize the heading, description and label of the submit button in the modal:
```php
use App\Models\Post;
use Filament\Actions\Action;
Action::make('delete')
->action(fn (Post $record) => $record->delete())
->requiresConfirmation()
->modalHeading('Delete post')
->modalDescription('Are you sure you\'d like to delete this post? This cannot be undone.')
->modalSubmitActionLabel('Yes, delete it')
```
<AutoScreenshot name="actions/modal/confirmation-custom-text" alt="Confirmation modal with custom text" version="4.x" />
### Rendering a schema in a modal
Filament allows you to render a [schema](../schemas) in a modal, which allows you to render any of the available components to build a UI. Usually, it is useful to build a form in the schema that can collect extra information from the user before the action runs, but any UI can be rendered:
```php
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Section;
Action::make('viewUser')
->schema([
Grid::make(2)
->schema([
Section::make('Details')
->schema([
TextInput::make('name'),
Select::make('position')
->options([
'developer' => 'Developer',
'designer' => 'Designer',
]),
Checkbox::make('is_admin'),
]),
Section::make('Auditing')
->schema([
TextEntry::make('created_at')
->dateTime(),
TextEntry::make('updated_at')
->dateTime(),
]),
]),
])
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `schema()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
#### Rendering a form in a modal
You may use [form field](../forms) to create action modal forms. The data from the form is available in the `$data` array of the `action()` closure:
```php
use App\Models\Post;
@@ -37,7 +98,7 @@ use Filament\Actions\Action;
use Filament\Forms\Components\Select;
Action::make('updateAuthor')
->form([
->schema([
Select::make('authorId')
->label('Author')
->options(User::query()->pluck('name', 'id'))
@@ -51,7 +112,7 @@ Action::make('updateAuthor')
<AutoScreenshot name="actions/modal/form" alt="Modal with form" version="4.x" />
### Filling the form with existing data
##### Filling the form with existing data
You may fill the form with existing data, using the `fillForm()` method:
@@ -65,7 +126,7 @@ Action::make('updateAuthor')
->fillForm(fn (Post $record): array => [
'authorId' => $record->author->id,
])
->form([
->schema([
Select::make('authorId')
->label('Author')
->options(User::query()->pluck('name', 'id'))
@@ -77,9 +138,32 @@ Action::make('updateAuthor')
})
```
### Using a wizard as a modal form
<UtilityInjection set="actions" version="4.x">The `fillForm()` method also accepts a function to dynamically calculate the data to fill the form with. You can inject various utilities into the function as parameters.</UtilityInjection>
You may create a [multistep form wizard](../schemas/layouts/wizard) inside a modal. Instead of using a `form()`, define a `steps()` array and pass your `Step` objects:
##### Disabling all form fields
You may wish to disable all form fields in the modal, ensuring the user cannot edit them. You may do so using the `disabledForm()` method:
```php
use App\Models\Post;
use Filament\Actions\Action;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
Action::make('approvePost')
->schema([
TextInput::make('title'),
Textarea::make('content'),
])
->disabledForm()
->action(function (Post $record): void {
$record->approve();
})
```
#### Rendering a wizard in a modal
You may create a [multistep form wizard](../schemas/wizards) inside a modal. Instead of using a `schema()`, define a `steps()` array and pass your `Step` objects:
```php
use Filament\Actions\Action;
@@ -120,51 +204,7 @@ Action::make('create')
<AutoScreenshot name="actions/modal/wizard" alt="Modal with wizard" version="4.x" />
### Disabling all form fields
You may wish to disable all form fields in the modal, ensuring the user cannot edit them. You may do so using the `disabledForm()` method:
```php
use App\Models\Post;
use App\Models\User;
use Filament\Actions\Action;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
Action::make('approvePost')
->form([
TextInput::make('title'),
Textarea::make('content'),
])
->fillForm(fn (Post $record): array => [
'title' => $record->title,
'content' => $record->content,
])
->disabledForm()
->action(function (Post $record): void {
$record->approve();
})
```
## Customizing the modal's heading, description, and submit action label
You may customize the heading, description and label of the submit button in the modal:
```php
use App\Models\Post;
use Filament\Actions\Action;
Action::make('delete')
->action(fn (Post $record) => $record->delete())
->requiresConfirmation()
->modalHeading('Delete post')
->modalDescription('Are you sure you\'d like to delete this post? This cannot be undone.')
->modalSubmitActionLabel('Yes, delete it')
```
<AutoScreenshot name="actions/modal/confirmation-custom-text" alt="Confirmation modal with custom text" version="4.x" />
## Adding an icon inside the modal
### Adding an icon inside the modal
You may add an [icon](../styling/icons) inside the modal using the `modalIcon()` method:
@@ -178,6 +218,8 @@ Action::make('delete')
->modalIcon('heroicon-o-trash')
```
<UtilityInjection set="actions" version="4.x">The `modalIcon()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
<AutoScreenshot name="actions/modal/icon" alt="Confirmation modal with icon" version="4.x" />
By default, the icon will inherit the color of the action button. You may customize the color of the icon using the `modalIconColor()` method:
@@ -194,7 +236,9 @@ Action::make('delete')
->modalIconColor('warning')
```
## Customizing the alignment of modal content
<UtilityInjection set="actions" version="4.x">The `modalIconColor()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
### Customizing the alignment of modal content
By default, modal content will be aligned to the start, or centered if the modal is `xs` or `sm` in [width](#changing-the-modal-width). If you wish to change the alignment of content in a modal, you can use the `modalAlignment()` method and pass it `Alignment::Start` or `Alignment::Center`:
@@ -203,7 +247,7 @@ use Filament\Actions\Action;
use Filament\Support\Enums\Alignment;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -212,7 +256,43 @@ Action::make('updateAuthor')
->modalAlignment(Alignment::Center)
```
## Custom modal content
<UtilityInjection set="actions" version="4.x">The `modalAlignment()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
### Making the modal header sticky
The header of a modal scrolls out of view with the modal content when it overflows the modal size. However, slide-overs have a sticky header that's always visible. You may control this behavior using `stickyModalHeader()`:
```php
use Filament\Actions\Action;
Action::make('updateAuthor')
->schema([
// ...
])
->action(function (array $data): void {
// ...
})
->stickyModalHeader()
```
### Making the modal footer sticky
The footer of a modal is rendered inline after the content by default. Slide-overs, however, have a sticky footer that always shows when scrolling the content. You may enable this for a modal too using `stickyModalFooter()`:
```php
use Filament\Actions\Action;
Action::make('updateAuthor')
->schema([
// ...
])
->action(function (array $data): void {
// ...
})
->stickyModalFooter()
```
### Custom modal content
You may define custom content to be rendered inside your modal, which you can specify by passing a Blade view into the `modalContent()` method:
@@ -225,7 +305,9 @@ Action::make('advance')
->modalContent(view('filament.pages.actions.advance'))
```
### Passing data to the custom modal content
<UtilityInjection set="actions" version="4.x">The `modalContent()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
#### Passing data to the custom modal content
You can pass data to the view by returning it from a function. For example, if the `$record` of an action is set, you can pass that through to the view:
@@ -241,7 +323,7 @@ Action::make('advance')
))
```
### Adding custom modal content below the form
#### Adding custom modal content below the form
By default, the custom content is displayed above the modal form if there is one, but you can add content below using `modalContentFooter()` if you wish:
@@ -254,7 +336,9 @@ Action::make('advance')
->modalContentFooter(view('filament.pages.actions.advance'))
```
### Adding an action to custom modal content
<UtilityInjection set="actions" version="4.x">The `modalContentFooter()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
#### Adding an action to custom modal content
You can add an action button to your custom modal content, which is useful if you want to add a button that performs an action other than the main action. You can do this by registering an action with the `registerModalActions()` method, and then passing it to the view:
@@ -292,7 +376,7 @@ You can open a "slide-over" dialog instead of a modal by using the `slideOver()`
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -305,40 +389,6 @@ Action::make('updateAuthor')
Instead of opening in the center of the screen, the modal content will now slide in from the right and consume the entire height of the browser.
## Making the modal header sticky
The header of a modal scrolls out of view with the modal content when it overflows the modal size. However, slide-overs have a sticky header that's always visible. You may control this behavior using `stickyModalHeader()`:
```php
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
// ...
])
->action(function (array $data): void {
// ...
})
->stickyModalHeader()
```
## Making the modal footer sticky
The footer of a modal is rendered inline after the content by default. Slide-overs, however, have a sticky footer that always shows when scrolling the content. You may enable this for a modal too using `stickyModalFooter()`:
```php
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
// ...
])
->action(function (array $data): void {
// ...
})
->stickyModalFooter()
```
## Changing the modal width
You can change the width of the modal by using the `modalWidth()` method. Options correspond to [Tailwind's max-width scale](https://tailwindcss.com/docs/max-width). The options are `ExtraSmall`, `Small`, `Medium`, `Large`, `ExtraLarge`, `TwoExtraLarge`, `ThreeExtraLarge`, `FourExtraLarge`, `FiveExtraLarge`, `SixExtraLarge`, `SevenExtraLarge`, and `Screen`:
@@ -348,7 +398,7 @@ use Filament\Actions\Action;
use Filament\Support\Enums\Width;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -357,6 +407,8 @@ Action::make('updateAuthor')
->modalWidth(Width::FiveExtraLarge)
```
<UtilityInjection set="actions" version="4.x">The `modalWidth()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
## Executing code when the modal opens
You may execute code within a closure when the modal opens, by passing it to the `mountUsing()` method:
@@ -373,13 +425,13 @@ Action::make('create')
})
```
> The `mountUsing()` method, by default, is used by Filament to initialize the [form](#modal-forms). If you override this method, you will need to call `$form->fill()` to ensure the form is initialized correctly. If you wish to populate the form with data, you can do so by passing an array to the `fill()` method, instead of [using `fillForm()` on the action itself](#filling-the-form-with-existing-data).
> The `mountUsing()` method, by default, is used by Filament to initialize the [form](#rendering-a-form-in-a-modal). If you override this method, you will need to call `$form->fill()` to ensure the form is initialized correctly. If you wish to populate the form with data, you can do so by passing an array to the `fill()` method, instead of [using `fillForm()` on the action itself](#filling-the-form-with-existing-data).
## Customizing the action buttons in the footer of the modal
By default, there are two actions in the footer of a modal. The first is a button to submit, which executes the `action()`. The second button closes the modal and cancels the action.
### Modifying a default modal footer action button
### Modifying the default modal footer action button
To modify the action instance that is used to render one of the default action buttons, you may pass a closure to the `modalSubmitAction()` and `modalCancelAction()` methods:
@@ -413,7 +465,7 @@ You may pass an array of extra actions to be rendered, between the default actio
use Filament\Actions\Action;
Action::make('create')
->form([
->schema([
// ...
])
// ...
@@ -422,6 +474,8 @@ Action::make('create')
])
```
<UtilityInjection set="actions" version="4.x">The `extraModalFooterActions()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
`$action->makeModalSubmitAction()` returns an action instance that can be customized using the [methods available to customize trigger buttons](overview).
The second parameter of `makeModalSubmitAction()` allows you to pass an array of arguments that will be accessible inside the action's `action()` closure as `$arguments`. These could be useful as flags to indicate that the action should behave differently based on the user's decision:
@@ -430,7 +484,7 @@ The second parameter of `makeModalSubmitAction()` allows you to pass an array of
use Filament\Actions\Action;
Action::make('create')
->form([
->schema([
// ...
])
// ...
@@ -524,7 +578,7 @@ use Filament\Actions\Action;
use Filament\Forms\Components\TextInput;
Action::make('first')
->form([
->schema([
TextInput::make('foo'),
])
->action(function () {
@@ -549,7 +603,7 @@ Even if you have multiple layers of nesting, the `$mountedActions` array will co
use Filament\Actions\Action;
Action::make('first')
->form([
->schema([
TextInput::make('foo'),
])
->action(function () {
@@ -557,7 +611,7 @@ Action::make('first')
})
->extraModalFooterActions([
Action::make('second')
->form([
->schema([
TextInput::make('bar'),
])
->arguments(['number' => 2])
@@ -566,7 +620,7 @@ Action::make('first')
})
->extraModalFooterActions([
Action::make('third')
->form([
->schema([
TextInput::make('baz'),
])
->arguments(['number' => 3])
@@ -592,7 +646,9 @@ Action::make('first')
])
```
## Closing the modal by clicking away
## Closing the modal
### Closing the modal by clicking away
By default, when you click away from a modal, it will close itself. If you wish to disable this behavior for a specific action, you can use the `closeModalByClickingAway(false)` method:
@@ -600,7 +656,7 @@ By default, when you click away from a modal, it will close itself. If you wish
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -609,6 +665,8 @@ Action::make('updateAuthor')
->closeModalByClickingAway(false)
```
<UtilityInjection set="actions" version="4.x">The `closeModalByClickingAway()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
If you'd like to change the behavior for all modals in the application, you can do so by calling `Modal::closedByClickingAway()` inside a service provider or middleware:
```php
@@ -617,7 +675,7 @@ use Filament\Support\View\Components\ModalComponent;
ModalComponent::closedByClickingAway(false);
```
## Closing the modal by escaping
### Closing the modal by escaping
By default, when you press escape on a modal, it will close itself. If you wish to disable this behavior for a specific action, you can use the `closeModalByEscaping(false)` method:
@@ -625,7 +683,7 @@ By default, when you press escape on a modal, it will close itself. If you wish
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -634,6 +692,8 @@ Action::make('updateAuthor')
->closeModalByEscaping(false)
```
<UtilityInjection set="actions" version="4.x">The `closeModalByEscaping()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
If you'd like to change the behavior for all modals in the application, you can do so by calling `Modal::closedByEscaping()` inside a service provider or middleware:
```php
@@ -642,7 +702,7 @@ use Filament\Support\View\Components\ModalComponent;
ModalComponent::closedByEscaping(false);
```
## Hiding the modal close button
### Hiding the modal close button
By default, modals have a close button in the top right corner. If you wish to hide the close button, you can use the `modalCloseButton(false)` method:
@@ -650,7 +710,7 @@ By default, modals have a close button in the top right corner. If you wish to h
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -659,6 +719,8 @@ Action::make('updateAuthor')
->modalCloseButton(false)
```
<UtilityInjection set="actions" version="4.x">The `modalCloseButton()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
If you'd like to hide the close button for all modals in the application, you can do so by calling `Modal::closeButton(false)` inside a service provider or middleware:
```php
@@ -675,7 +737,7 @@ By default, modals will autofocus on the first focusable element when opened. If
use Filament\Actions\Action;
Action::make('updateAuthor')
->form([
->schema([
// ...
])
->action(function (array $data): void {
@@ -684,6 +746,8 @@ Action::make('updateAuthor')
->modalAutofocus(false)
```
<UtilityInjection set="actions" version="4.x">The `modalAutofocus()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
If you'd like to disable autofocus for all modals in the application, you can do so by calling `Modal::autofocus(false)` inside a service provider or middleware:
```php
@@ -696,7 +760,7 @@ ModalComponent::autofocus(false);
When you use database queries or other heavy operations inside modal configuration methods like `modalHeading()`, they can be executed more than once. This is because Filament uses these methods to decide whether to render the modal or not, and also to render the modal's content.
To skip the check that Filament does to decide whether to render the modal, you can use the `modal()` method, which will inform Filament that the modal exists for this action and it does not need to check again:
To skip the check that Filament does to decide whether to render the modal, you can use the `modal()` method, which will inform Filament that the modal exists for this action, and it does not need to check again:
```php
use Filament\Actions\Action;
@@ -716,13 +780,15 @@ Action::make('create')
->action(function (array $data): void {
// ...
})
->modalHidden(fn (): bool => $this->role !== 'admin')
->modalHidden($this->role !== 'admin')
->modalContent(view('filament.pages.actions.create'))
```
<UtilityInjection set="actions" version="4.x">The `modalHidden()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
## Adding extra attributes to the modal window
You may also pass extra HTML attributes to the modal window using `extraModalWindowAttributes()`:
You can pass extra HTML attributes to the modal window via the `extraModalWindowAttributes()` method, which will be merged onto its outer HTML element. The attributes should be represented by an array, where the key is the attribute name and the value is the attribute value:
```php
use Filament\Actions\Action;
@@ -730,3 +796,9 @@ use Filament\Actions\Action;
Action::make('updateAuthor')
->extraModalWindowAttributes(['class' => 'update-author-modal'])
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `extraModalWindowAttributes()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
<Aside variant="tip">
By default, calling `extraModalWindowAttributes()` multiple times will overwrite the previous attributes. If you wish to merge the attributes instead, you can pass `merge: true` to the method.
</Aside>
+23 -69
View File
@@ -2,6 +2,7 @@
title: Grouping actions
---
import AutoScreenshot from "@components/AutoScreenshot.astro"
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -44,63 +45,6 @@ ActionGroup::make([
<AutoScreenshot name="tables/actions/group-button" alt="Table with button action group" version="4.x" />
### Setting the action group button icon
You may set the [icon](../styling/icons) of the action group button using the `icon()` method:
```php
use Filament\Actions\ActionGroup;
ActionGroup::make([
// ...
])->icon('heroicon-m-ellipsis-horizontal');
```
<AutoScreenshot name="tables/actions/group-icon" alt="Table with customized action group icon" version="4.x" />
### Setting the action group button color
You may set the color of the action group button using the `color()` method:
```php
use Filament\Actions\ActionGroup;
ActionGroup::make([
// ...
])->color('info');
```
<AutoScreenshot name="tables/actions/group-color" alt="Table with customized action group color" version="4.x" />
### Setting the action group button size
Buttons come in 3 sizes - `sm`, `md` or `lg`. You may set the size of the action group button using the `size()` method:
```php
use Filament\Actions\ActionGroup;
use Filament\Support\Enums\Size;
ActionGroup::make([
// ...
])->size(Size::Small);
```
<AutoScreenshot name="tables/actions/group-small" alt="Table with small action group" version="4.x" />
### Setting the action group tooltip
You may set the tooltip of the action group using the `tooltip()` method:
```php
use Filament\Actions\ActionGroup;
ActionGroup::make([
// ...
])->tooltip('Actions');
```
<AutoScreenshot name="tables/actions/group-tooltip" alt="Table with action group tooltip" version="4.x" />
## Setting the placement of the dropdown
The dropdown may be positioned relative to the trigger button by using the `dropdownPlacement()` method:
@@ -114,6 +58,8 @@ ActionGroup::make([
->dropdownPlacement('top-start')
```
<UtilityInjection set="actionGroups" version="4.x">The `dropdownPlacement()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
<AutoScreenshot name="actions/group/placement" alt="Action group with top placement style" version="4.x" />
## Adding dividers between actions
@@ -133,6 +79,8 @@ ActionGroup::make([
The `dropdown(false)` method puts the actions inside the parent dropdown, instead of a new nested dropdown.
<UtilityInjection set="actionGroups" version="4.x">The `dropdown()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
<AutoScreenshot name="actions/group/nested" alt="Action groups nested with dividers" version="4.x" />
## Setting the width of the dropdown
@@ -149,18 +97,7 @@ ActionGroup::make([
->dropdownWidth(Width::ExtraSmall)
```
## Controlling the maximum height of the dropdown
The dropdown content can have a maximum height using the `maxHeight()` method, so that it scrolls. You can pass a [CSS length](https://developer.mozilla.org/en-US/docs/Web/CSS/length):
```php
use Filament\Actions\ActionGroup;
ActionGroup::make([
// Array of actions
])
->maxHeight('400px')
```
<UtilityInjection set="actionGroups" version="4.x">The `dropdownWidth()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
## Controlling the dropdown offset
@@ -174,3 +111,20 @@ ActionGroup::make([
])
->dropdownOffset(16)
```
<UtilityInjection set="actionGroups" version="4.x">The `dropdownOffset()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
## Controlling the maximum height of the dropdown
The dropdown content can have a maximum height using the `maxHeight()` method, so that it scrolls. You can pass a [CSS length](https://developer.mozilla.org/en-US/docs/Web/CSS/length):
```php
use Filament\Actions\ActionGroup;
ActionGroup::make([
// Array of actions
])
->maxHeight('400px')
```
<UtilityInjection set="actionGroups" version="4.x">The `maxHeight()` method also accepts a function to dynamically calculate the value. You can inject various utilities into the function as parameters.</UtilityInjection>
+19 -25
View File
@@ -1,6 +1,7 @@
---
title: Create action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -11,8 +12,7 @@ use Filament\Actions\CreateAction;
use Filament\Forms\Components\TextInput;
CreateAction::make()
->model(Post::class)
->form([
->schema([
TextInput::make('title')
->required()
->maxLength(255),
@@ -20,28 +20,6 @@ CreateAction::make()
])
```
If you want to add this action to the header of a table, you may do so like this:
```php
use Filament\Actions\CreateAction;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->headerActions([
CreateAction::make()
->form([
TextInput::make('title')
->required()
->maxLength(255),
// ...
]),
]);
}
```
## Customizing data before saving
Sometimes, you may wish to modify form data before it is finally saved to the database. To do this, you may use the `mutateFormDataUsing()` method, which has access to the `$data` as an array, and returns the modified version:
@@ -57,6 +35,8 @@ CreateAction::make()
})
```
<UtilityInjection set="actions" version="4.x">As well as `$data`, the `mutateDataUsing()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the creation process
You can tweak how the record is created with the `using()` method:
@@ -73,6 +53,8 @@ CreateAction::make()
`$model` is the class name of the model, but you can replace this with your own hard-coded class if you wish.
<UtilityInjection set="actions" version="4.x">As well as `$data` and `$model`, the `using()` function can inject various utilities as parameters.</UtilityInjection>
## Redirecting after creation
You may set up a custom redirect when the form is submitted using the `successRedirectUrl()` method:
@@ -96,6 +78,8 @@ CreateAction::make()
]))
```
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the save notification
When the record is successfully created, a notification is dispatched to the user, which indicates the success of their action.
@@ -109,6 +93,8 @@ CreateAction::make()
->successNotificationTitle('User registered')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -124,6 +110,8 @@ CreateAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
@@ -163,6 +151,8 @@ CreateAction::make()
})
```
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
## Halting the creation process
At any time, you may call `$action->halt()` from inside a lifecycle hook or mutation method, which will halt the entire creation process:
@@ -201,7 +191,7 @@ $action->cancel();
## Using a wizard
You may easily transform the creation process into a multistep wizard. Instead of using a `form()`, define a `steps()` array and pass your `Step` objects:
You may easily transform the creation process into a multistep wizard. Instead of using a `schema()`, define a `steps()` array and pass your `Step` objects:
```php
use Filament\Actions\CreateAction;
@@ -267,6 +257,8 @@ CreateAction::make()
->createAnother(false)
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `createAnother()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
### Preserving data when creating another
By default, when the user uses the "create and create another" feature, all the form data is cleared so the user can start fresh. If you'd like to preserve some of the data in the form, you may use the `preserveFormDataWhenCreatingAnother()` method, passing an array of fields to preserve:
@@ -296,3 +288,5 @@ use Filament\Actions\CreateAction;
CreateAction::make()
->preserveFormDataWhenCreatingAnother(fn (array $data): array => $data)
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `preserveFormDataWhenCreatingAnother()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
+16 -24
View File
@@ -1,6 +1,7 @@
---
title: Edit action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -11,8 +12,7 @@ use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
EditAction::make()
->record($this->post)
->form([
->schema([
TextInput::make('title')
->required()
->maxLength(255),
@@ -20,28 +20,6 @@ EditAction::make()
])
```
If you want to edit table rows, you may do so like this:
```php
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
EditAction::make()
->form([
TextInput::make('title')
->required()
->maxLength(255),
// ...
]),
]);
}
```
## Customizing data before filling the form
You may wish to modify the data from a record before it is filled into the form. To do this, you may use the `mutateRecordDataUsing()` method to modify the `$data` array, and return the modified version before it is filled into the form:
@@ -57,6 +35,8 @@ EditAction::make()
})
```
<UtilityInjection set="actions" version="4.x">As well as `$data`, the `mutateRecordDataUsing()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing data before saving
Sometimes, you may wish to modify form data before it is finally saved to the database. To do this, you may use the `mutateFormDataUsing()` method, which has access to the `$data` as an array, and returns the modified version:
@@ -72,6 +52,8 @@ EditAction::make()
})
```
<UtilityInjection set="actions" version="4.x">As well as `$data`, the `mutateDataUsing()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the saving process
You can tweak how the record is updated with the `using()` method:
@@ -88,6 +70,8 @@ EditAction::make()
})
```
<UtilityInjection set="actions" version="4.x">As well as `$record` and `$data`, the `using()` function can inject various utilities as parameters.</UtilityInjection>
## Redirecting after saving
You may set up a custom redirect when the form is submitted using the `successRedirectUrl()` method:
@@ -111,6 +95,8 @@ EditAction::make()
]))
```
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the save notification
When the record is successfully updated, a notification is dispatched to the user, which indicates the success of their action.
@@ -124,6 +110,8 @@ EditAction::make()
->successNotificationTitle('User updated')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -139,6 +127,8 @@ EditAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
@@ -178,6 +168,8 @@ EditAction::make()
})
```
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
## Halting the saving process
At any time, you may call `$action->halt()` from inside a lifecycle hook or mutation method, which will halt the entire saving process:
+4 -24
View File
@@ -1,6 +1,7 @@
---
title: View action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -11,8 +12,7 @@ use Filament\Actions\ViewAction;
use Filament\Forms\Components\TextInput;
ViewAction::make()
->record($this->post)
->form([
->schema([
TextInput::make('title')
->required()
->maxLength(255),
@@ -20,28 +20,6 @@ ViewAction::make()
])
```
If you want to view table rows, you may do so like this:
```php
use Filament\Actions\ViewAction;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
ViewAction::make()
->form([
TextInput::make('title')
->required()
->maxLength(255),
// ...
]),
]);
}
```
## Customizing data before filling the form
You may wish to modify the data from a record before it is filled into the form. To do this, you may use the `mutateRecordDataUsing()` method to modify the `$data` array, and return the modified version before it is filled into the form:
@@ -56,3 +34,5 @@ ViewAction::make()
return $data;
})
```
<UtilityInjection set="actions" version="4.x">As well as `$data`, the `mutateRecordDataUsing()` function can inject various utilities as parameters.</UtilityInjection>
+10 -17
View File
@@ -1,6 +1,7 @@
---
title: Delete action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -10,25 +11,9 @@ Filament includes an action that is able to delete Eloquent records. When the tr
use Filament\Actions\DeleteAction;
DeleteAction::make()
->record($this->post)
```
If you want to add this action to a row of a table, you may do so like this:
```php
use Filament\Actions\DeleteAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
DeleteAction::make()
]);
}
```
Or if you want to add it as a table bulk action, so that the user can choose which rows to delete, they can use `Filament\Actions\DeleteBulkAction`:
Or if you want to add it as a table bulk action, so that the user can choose which rows to delete, use `Filament\Actions\DeleteBulkAction`:
```php
use Filament\Actions\DeleteBulkAction;
@@ -54,6 +39,8 @@ DeleteAction::make()
->successRedirectUrl(route('posts.list'))
```
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the delete notification
When the record is successfully deleted, a notification is dispatched to the user, which indicates the success of their action.
@@ -67,6 +54,8 @@ DeleteAction::make()
->successNotificationTitle('User deleted')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -82,6 +71,8 @@ DeleteAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
@@ -106,3 +97,5 @@ DeleteAction::make()
// ...
})
```
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
+17 -28
View File
@@ -1,6 +1,7 @@
---
title: Replicate action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -10,23 +11,6 @@ Filament includes an action that is able to [replicate](https://laravel.com/docs
use Filament\Actions\ReplicateAction;
ReplicateAction::make()
->record($this->post)
```
If you want to replicate table rows, you may do so like this:
```php
use Filament\Actions\ReplicateAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
ReplicateAction::make(),
// ...
]);
}
```
## Excluding attributes
@@ -66,17 +50,7 @@ ReplicateAction::make()
->successRedirectUrl(route('posts.list'))
```
If you want to redirect using the replica, use the `$replica` parameter:
```php
use Filament\Actions\ReplicateAction;
use Illuminate\Database\Eloquent\Model;
ReplicateAction::make()
->successRedirectUrl(fn (Model $replica): string => route('posts.edit', [
'post' => $replica,
]))
```
<UtilityInjection set="actions" version="4.x" extras="Replica Eloquent record;;Illuminate\Database\Eloquent\Model;;$replica;;The Eloquent model instance that was just created as a replica of the original record.">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the replicate notification
@@ -91,6 +65,8 @@ ReplicateAction::make()
->successNotificationTitle('Category replicated')
```
<UtilityInjection set="actions" version="4.x" extras="Replica Eloquent record;;Illuminate\Database\Eloquent\Model;;$replica;;The Eloquent model instance that was just created as a replica of the original record.">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -106,6 +82,17 @@ ReplicateAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.||Replica Eloquent record;;Illuminate\Database\Eloquent\Model;;$replica;;The Eloquent model instance that was just created as a replica of the original record.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
use Filament\Actions\RestoreAction;
ReplicateAction::make()
->successNotification(null)
```
## Lifecycle hooks
Hooks may be used to execute code at various points within the action's lifecycle, like before the replica is saved.
@@ -126,6 +113,8 @@ ReplicateAction::make()
})
```
<UtilityInjection set="actions" version="4.x" extras="Replica Eloquent record;;Illuminate\Database\Eloquent\Model;;$replica;;The Eloquent model instance that was just created as a replica of the original record.">These hook functions can inject various utilities as parameters.</UtilityInjection>
## Halting the replication process
At any time, you may call `$action->halt()` from inside a lifecycle hook, which will halt the entire replication process:
+10 -17
View File
@@ -1,6 +1,7 @@
---
title: Force-delete action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -10,25 +11,9 @@ Filament includes an action that is able to force-delete [soft deleted](https://
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()
->record($this->post)
```
If you want to add this action to a row of a table, you may do so like this:
```php
use Filament\Actions\ForceDeleteAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
ForceDeleteAction::make()
]);
}
```
Or if you want to add it as a table bulk action, so that the user can choose which rows to force delete, they can use `Filament\Actions\ForceDeleteBulkAction`:
Or if you want to add it as a table bulk action, so that the user can choose which rows to force delete, use `Filament\Actions\ForceDeleteBulkAction`:
```php
use Filament\Actions\ForceDeleteBulkAction;
@@ -54,6 +39,8 @@ ForceDeleteAction::make()
->successRedirectUrl(route('posts.list'))
```
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the force-delete notification
When the record is successfully force-deleted, a notification is dispatched to the user, which indicates the success of their action.
@@ -67,6 +54,8 @@ ForceDeleteAction::make()
->successNotificationTitle('User force-deleted')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -82,6 +71,8 @@ ForceDeleteAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
@@ -106,3 +97,5 @@ ForceDeleteAction::make()
// ...
})
```
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
+10 -17
View File
@@ -1,6 +1,7 @@
---
title: Restore action
---
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -10,25 +11,9 @@ Filament includes an action that is able to restore [soft deleted](https://larav
use Filament\Actions\RestoreAction;
RestoreAction::make()
->record($this->post)
```
If you want to add this action to a row of a table, you may do so like this:
```php
use Filament\Actions\RestoreAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->actions([
RestoreAction::make()
]);
}
```
Or if you want to add it as a table bulk action, so that the user can choose which rows to restore, they can use `Filament\Actions\RestoreBulkAction`:
Or if you want to add it as a table bulk action, so that the user can choose which rows to restore, use `Filament\Actions\RestoreBulkAction`:
```php
use Filament\Actions\RestoreBulkAction;
@@ -54,6 +39,8 @@ RestoreAction::make()
->successRedirectUrl(route('posts.list'))
```
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
## Customizing the restore notification
When the record is successfully restored, a notification is dispatched to the user, which indicates the success of their action.
@@ -67,6 +54,8 @@ RestoreAction::make()
->successNotificationTitle('User restored')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You may customize the entire notification using the `successNotification()` method:
```php
@@ -82,6 +71,8 @@ RestoreAction::make()
)
```
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
To disable the notification altogether, use the `successNotification(null)` method:
```php
@@ -106,3 +97,5 @@ RestoreAction::make()
// ...
})
```
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
+40 -5
View File
@@ -1,6 +1,8 @@
---
title: Import action
---
import Aside from "@components/Aside.astro"
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -24,9 +26,13 @@ php artisan vendor:publish --tag=filament-actions-migrations
php artisan migrate
```
> If you're using PostgreSQL, make sure that the `data` column in the notifications migration is using `json()`: `$table->json('data')`.
<Aside variant="info">
If you're using PostgreSQL, make sure that the `data` column in the notifications migration is using `json()`: `$table->json('data')`.
</Aside>
> If you're using UUIDs for your `User` model, make sure that your `notifiable` column in the notifications migration is using `uuidMorphs()`: `$table->uuidMorphs('notifiable')`.
<Aside variant="info">
If you're using UUIDs for your `User` model, make sure that your `notifiable` column in the notifications migration is using `uuidMorphs()`: `$table->uuidMorphs('notifiable')`.
</Aside>
You may use the `ImportAction` like so:
@@ -161,6 +167,8 @@ ImportColumn::make('sku')
Any rows that do not pass validation will not be imported. Instead, they will be compiled into a new CSV of "failed rows", which the user can download after the import has finished. The user will be shown a list of validation errors for each row that failed.
<UtilityInjection set="importColumns" version="4.x">As well as allowing a static value, the `rules()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
### Casting state
Before [validation](#validating-csv-data), data from the CSV can be cast. This is useful for converting strings into the correct data type, otherwise validation may fail. For example, if you have a `price` column in your CSV, you may want to cast it to a float:
@@ -181,9 +189,13 @@ ImportColumn::make('price')
})
```
<UtilityInjection set="importColumns" version="4.x" extras="State;;mixed;;$state;;The state to cast, after it has been processed by other casting methods.||Original state;;mixed;;$originalState;;The state to cast, before it was processed by other casting methods.">As well as `$state`, the `castStateUsing()` method allows you to inject various utilities into the function as parameters.</UtilityInjection>
In this example, we pass in a function that is used to cast the `$state`. This function removes any non-numeric characters from the string, casts it to a float, and rounds it to two decimal places.
> Please note: if a column is not [required by validation](#validating-csv-data), and it is empty, it will not be cast.
<Aside variant="info">
If a column is not [required by validation](#validating-csv-data), and it is empty, it will not be cast.
</Aside>
Filament also ships with some built-in casting methods:
@@ -233,6 +245,8 @@ ImportColumn::make('price')
})
```
<UtilityInjection set="importColumns" version="4.x" extras="State;;mixed;;$state;;The state to cast, after it has been processed by other casting methods.||Original state;;mixed;;$originalState;;The state to cast, before it was processed by other casting methods.">As well as `$state`, the `castStateUsing()` method allows you to inject various utilities into the function as parameters.</UtilityInjection>
### Handling multiple values in a single column
You may use the `multiple()` method to cast the values in a column to an array. It accepts a delimiter as its first argument, which is used to split the values in the column into an array. For example, if you have a `documentation_urls` column in your CSV, you may want to cast it to an array of URLs:
@@ -244,6 +258,8 @@ ImportColumn::make('documentation_urls')
->multiple(',')
```
<UtilityInjection set="importColumns" version="4.x">As well as allowing a static value, the `multiple()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
In this example, we pass in a comma as the delimiter, so the values in the column will be split by commas, and cast to an array.
#### Casting each item in an array
@@ -272,6 +288,8 @@ ImportColumn::make('customer_ratings')
->nestedRecursiveRules(['integer', 'min:1', 'max:5'])
```
<UtilityInjection set="importColumns" version="4.x">As well as allowing a static value, the `nestedRecursiveRules()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
### Importing relationships
You may use the `relationship()` method to import a relationship. At the moment, `BelongsTo` and `BelongsToMany` relationships are supported. For example, if you have a `category` column in your CSV, you may want to import the category `BelongsTo` relationship:
@@ -332,6 +350,8 @@ ImportColumn::make('author')
})
```
<UtilityInjection set="importColumns" version="4.x" extras="State;;mixed;;$state;;The state to resolve into a record.">The function passed to `resolveUsing` allows you to inject various utilities into the function as parameters.</UtilityInjection>
If you are using a `BelongsToMany` relationship, the `$state` will be an array, and you should return a collection of records that you have resolved:
```php
@@ -383,6 +403,7 @@ If you want to customize how column state is filled into a record, you can pass
```php
use App\Models\Product;
use Filament\Actions\Imports\ImportColumn;
ImportColumn::make('sku')
->fillRecordUsing(function (Product $record, string $state): void {
@@ -390,12 +411,14 @@ ImportColumn::make('sku')
})
```
<UtilityInjection set="importColumns" version="4.x" extras="State;;mixed;;$state;;The state to fill into the record.">The function passed to the `fillRecordUsing()` method allows you to inject various utilities into the function as parameters.</UtilityInjection>
### Adding helper text below the import column
Sometimes, you may wish to provide extra information for the user before validation. You can do this by adding `helperText()` to a column, which gets displayed below the mapping select:
```php
use Filament\Forms\Components\TextInput;
use Filament\Actions\Imports\ImportColumn;
ImportColumn::make('skus')
->multiple(',')
@@ -621,6 +644,8 @@ ImportAction::make()
->maxRows(100000)
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `maxRows()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
## Changing the import chunk size
Filament will chunk the CSV, and process each chunk in a different queued job. By default, chunks are 100 rows at a time. You can change this by calling the `chunkSize()` method on the action:
@@ -634,7 +659,11 @@ ImportAction::make()
->chunkSize(250)
```
If you are encountering memory or timeout issues when importing large CSV files, you may wish to reduce the chunk size.
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `chunkSize()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
<Aside variant="tip">
If you are encountering memory or timeout issues when importing large CSV files, you may wish to reduce the chunk size.
</Aside>
## Changing the CSV delimiter
@@ -649,6 +678,8 @@ ImportAction::make()
->csvDelimiter(';')
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `csvDelimiter()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You can only specify a single character, otherwise an exception will be thrown.
## Changing the column header offset
@@ -664,6 +695,8 @@ ImportAction::make()
->headerOffset(5)
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `headerOffset()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
## Customizing the import job
The default job for processing imports is `Filament\Actions\Imports\Jobs\ImportCsv`. If you want to extend this class and override any of its methods, you may replace the original class in the `register()` method of a service provider:
@@ -822,6 +855,8 @@ ImportAction::make()
]),
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `fileRules()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
## Lifecycle hooks
Hooks may be used to execute code at various points within an importer's lifecycle, like before a record is saved. To set up a hook, create a protected method on the importer class with the name of the hook:
+27 -3
View File
@@ -1,6 +1,8 @@
---
title: Export action
---
import Aside from "@components/Aside.astro"
import UtilityInjection from "@components/UtilityInjection.astro"
## Introduction
@@ -22,9 +24,13 @@ php artisan vendor:publish --tag=filament-actions-migrations
php artisan migrate
```
> If you're using PostgreSQL, make sure that the `data` column in the notifications migration is using `json()`: `$table->json('data')`.
<Aside variant="info">
If you're using PostgreSQL, make sure that the `data` column in the notifications migration is using `json()`: `$table->json('data')`.
</Aside>
> If you're using UUIDs for your `User` model, make sure that your `notifiable` column in the notifications migration is using `uuidMorphs()`: `$table->uuidMorphs('notifiable')`.
<Aside variant="info">
If you're using UUIDs for your `User` model, make sure that your `notifiable` column in the notifications migration is using `uuidMorphs()`: `$table->uuidMorphs('notifiable')`.
</Aside>
You may use the `ExportAction` like so:
@@ -159,6 +165,8 @@ ExportColumn::make('amount_including_vat')
})
```
<UtilityInjection set="exportColumns" version="4.x">As well as `$record`, the `state()` function can inject various utilities as parameters.</UtilityInjection>
### Formatting the value of an export column
You may instead pass a custom formatting callback to `formatStateUsing()`, which accepts the `$state` of the cell, and optionally the Eloquent `$record`:
@@ -170,6 +178,8 @@ ExportColumn::make('status')
->formatStateUsing(fn (string $state): string => __("statuses.{$state}"))
```
<UtilityInjection set="exportColumns" version="4.x" extras="State;;mixed;;$state;;The state to format.">As well as `$state`, the `formatStateUsing()` function can inject various utilities as parameters.</UtilityInjection>
If there are [multiple values](#exporting-multiple-values-in-a-cell) in the column, the function will be called for each value.
#### Limiting text length
@@ -183,6 +193,8 @@ ExportColumn::make('description')
->limit(50)
```
<UtilityInjection set="exportColumns" version="4.x">As well as allowing a static value, the `limit()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
#### Limiting word count
You may limit the number of `words()` displayed in the cell:
@@ -194,6 +206,8 @@ ExportColumn::make('description')
->words(10)
```
<UtilityInjection set="exportColumns" version="4.x">As well as allowing a static value, the `words()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
#### Adding a prefix or suffix
You may add a `prefix()` or `suffix()` to the cell's value:
@@ -206,6 +220,8 @@ ExportColumn::make('domain')
->suffix('.com')
```
<UtilityInjection set="exportColumns" version="4.x">As well as allowing static values, the `prefix()` and `suffix()` methods also accept functions to dynamically calculate them. You can inject various utilities into the functions as parameters.</UtilityInjection>
### Exporting multiple values in a cell
By default, if there are multiple values in the column, they will be comma-separated. You may use the `listAsJson()` method to list them as a JSON array instead:
@@ -476,6 +492,8 @@ ExportAction::make()
])
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `options()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
Now, you can access the data from these options inside the exporter class, by injecting the `$options` argument into any closure function. For example, you might want to use it inside `formatStateUsing()` to [format a column's value](#formatting-the-value-of-an-export-column):
```php
@@ -561,7 +579,11 @@ ExportAction::make()
->chunkSize(250)
```
If you are encountering memory or timeout issues when exporting large CSV files, you may wish to reduce the chunk size.
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `chunkSize()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
<Aside variant="tip">
If you are encountering memory or timeout issues when importing large CSV files, you may wish to reduce the chunk size.
</Aside>
## Changing the CSV delimiter
@@ -574,6 +596,8 @@ public static function getCsvDelimiter(): string
}
```
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `csvDelimiter()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
You can only specify a single character, otherwise an exception will be thrown.
## Customizing XLSX files
+10 -1
View File
@@ -329,7 +329,16 @@ class ActionGroup extends ViewComponent implements Arrayable, HasEmbeddedView
protected function resolveDefaultClosureDependencyForEvaluationByName(string $parameterName): array
{
return match ($parameterName) {
'record' => [$this->getRecord()],
'livewire' => [$this->getLivewire()],
'model' => [$this->getModel() ?? $this->getSchemaContainer()?->getModel() ?? $this->getSchemaComponent()?->getModel()],
'mountedActions' => [$this->getLivewire()->getMountedActions()],
'record' => [$this->getRecord() ?? $this->getSchemaContainer()?->getRecord() ?? $this->getSchemaComponent()?->getRecord()],
'schema' => [$this->getSchemaContainer()],
'schemaComponent', 'component' => [$this->getSchemaComponent()],
'schemaOperation', 'context', 'operation' => [$this->getSchemaContainer()?->getOperation() ?? $this->getSchemaComponent()?->getContainer()->getOperation()],
'schemaGet', 'get' => [$this->getSchemaComponent()->makeGetUtility()],
'schemaComponentState', 'state' => [$this->getSchemaComponent()->getState()],
'table' => [$this->getTable()],
default => parent::resolveDefaultClosureDependencyForEvaluationByName($parameterName),
};
}
+1 -1
View File
@@ -48,7 +48,7 @@ class DeleteAction extends Action
});
$this->action(function (): void {
$result = $this->process(static fn (Model $record) => $record->delete());
$result = $this->process(static fn (Model $record): ?bool => $record->delete());
if (! $result) {
$this->failure();
+1 -1
View File
@@ -36,7 +36,7 @@ class ForceDeleteAction extends Action
$this->modalIcon(FilamentIcon::resolve('actions::force-delete-action.modal') ?? Heroicon::OutlinedTrash);
$this->action(function (): void {
$result = $this->process(static fn (Model $record) => $record->forceDelete());
$result = $this->process(static fn (Model $record): ?bool => $record->forceDelete());
if (! $result) {
$this->failure();
@@ -316,10 +316,7 @@ class ImportColumn extends Component
return $this;
}
/**
* @param array<string, mixed> $options
*/
public function castState(mixed $state, array $options): mixed
public function castState(mixed $state): mixed
{
$originalState = $state;
@@ -336,7 +333,6 @@ class ImportColumn extends Component
return $this->evaluate($this->castStateUsing, [
'originalState' => $originalState,
'state' => $state,
'options' => $options,
]);
}
+1 -4
View File
@@ -139,10 +139,7 @@ abstract class Importer
continue;
}
$this->data[$columnName] = $column->castState(
$this->data[$columnName],
$this->options,
);
$this->data[$columnName] = $column->castState($this->data[$columnName]);
}
}
+1 -1
View File
@@ -44,7 +44,7 @@ class RestoreAction extends Action
return;
}
$result = $this->process(static fn () => $record->restore());
$result = $this->process(static fn (): ?bool => $record->restore());
if (! $result) {
$this->failure();
-1
View File
@@ -82,7 +82,6 @@ use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
$schema
->components([
+1 -1
View File
@@ -32,7 +32,7 @@ Wizard::make([
<AutoScreenshot name="schemas/layout/wizard/simple" alt="Wizard" version="4.x" />
<Aside variant="tip">
We have different setup instructions if you're looking to add a wizard to the creation process inside a [panel resource](../resources/creating-records#using-a-wizard) or an [action modal](../actions/modals#using-a-wizard-as-a-modal-form). Following that documentation will ensure that the ability to submit the form is only available on the last step of the wizard.
We have different setup instructions if you're looking to add a wizard to the creation process inside a [panel resource](../resources/creating-records#using-a-wizard) or an [action modal](../actions/modals#rendering-a-wizard-in-a-modal). Following that documentation will ensure that the ability to submit the form is only available on the last step of the wizard.
</Aside>
## Rendering a submit button on the last step
+1 -1
View File
@@ -177,4 +177,4 @@ public function table(Table $table): Table
}
```
In this example, we have put two of the filters inside a [section](../../schemas/layouts/section) component, and used the `columns()` method to specify that the section should have two columns. We have also used the `columnSpanFull()` method to specify that the section should span the full width of the filter form, which is also 2 columns wide. We have inserted each filter into the form schema by using the filter's name as the key in the `$filters` array.
In this example, we have put two of the filters inside a [section](../../schemas/sections) component, and used the `columns()` method to specify that the section should have two columns. We have also used the `columnSpanFull()` method to specify that the section should span the full width of the filter form, which is also 2 columns wide. We have inserted each filter into the form schema by using the filter's name as the key in the `$filters` array.