Merge pull request #12155 from binaryfire/add-unique-action-modal-class

Add `extraModalWindowAttributes`
This commit is contained in:
Dan Harrin
2024-04-11 08:46:05 +01:00
committed by GitHub
5 changed files with 67 additions and 2 deletions
+9
View File
@@ -552,3 +552,12 @@ Action::make('create')
->modalHidden(fn (): bool => $this->role !== 'admin')
->modalContent(view('filament.pages.actions.create'))
```
## Adding extra attributes to the modal window
You may also pass extra HTML attributes to the modal window using `extraModalWindowAttributes()`:
```php
Action::make('updateAuthor')
->extraModalWindowAttributes(['class' => 'update-author-modal'])
```
@@ -10,6 +10,7 @@
:close-by-clicking-away="$action?->isModalClosedByClickingAway()"
:description="$action?->getModalDescription()"
display-classes="block"
:extra-modal-window-attribute-bag="$action?->getExtraModalWindowAttributeBag()"
:footer-actions="$action?->getVisibleModalFooterActions()"
:footer-actions-alignment="$action?->getModalFooterActionsAlignment()"
:heading="$action?->getModalHeading()"
@@ -69,6 +70,7 @@
:close-by-clicking-away="$action?->isModalClosedByClickingAway()"
:description="$action?->getModalDescription()"
display-classes="block"
:extra-modal-window-attribute-bag="$action?->getExtraModalWindowAttributeBag()"
:footer-actions="$action?->getVisibleModalFooterActions()"
:footer-actions-alignment="$action?->getModalFooterActionsAlignment()"
:heading="$action?->getModalHeading()"
@@ -122,6 +124,7 @@
:close-by-clicking-away="$action?->isModalClosedByClickingAway()"
:description="$action?->getModalDescription()"
display-classes="block"
:extra-modal-window-attribute-bag="$action?->getExtraModalWindowAttributeBag()"
:footer-actions="$action?->getVisibleModalFooterActions()"
:footer-actions-alignment="$action?->getModalFooterActionsAlignment()"
:heading="$action?->getModalHeading()"
@@ -181,6 +184,7 @@
:close-by-clicking-away="$action?->isModalClosedByClickingAway()"
:description="$action?->getModalDescription()"
display-classes="block"
:extra-modal-window-attribute-bag="$action?->getExtraModalWindowAttributeBag()"
:footer-actions="$action?->getVisibleModalFooterActions()"
:footer-actions-alignment="$action?->getModalFooterActionsAlignment()"
:heading="$action?->getModalHeading()"
@@ -240,6 +244,7 @@
:close-by-clicking-away="$action?->isModalClosedByClickingAway()"
:description="$action?->getModalDescription()"
display-classes="block"
:extra-modal-window-attribute-bag="$action?->getExtraModalWindowAttributeBag()"
:footer-actions="$action?->getVisibleModalFooterActions()"
:footer-actions-alignment="$action?->getModalFooterActionsAlignment()"
:heading="$action?->getModalHeading()"
@@ -0,0 +1,47 @@
<?php
namespace Filament\Actions\Concerns;
use Closure;
use Illuminate\View\ComponentAttributeBag;
trait HasExtraModalWindowAttributes
{
/**
* @var array<array<mixed> | Closure>
*/
protected array $extraModalWindowAttributes = [];
/**
* @param array<mixed> | Closure $attributes
*/
public function extraModalWindowAttributes(array | Closure $attributes, bool $merge = false): static
{
if ($merge) {
$this->extraModalWindowAttributes[] = $attributes;
} else {
$this->extraModalWindowAttributes = [$attributes];
}
return $this;
}
/**
* @return array<mixed>
*/
public function getExtraModalWindowAttributes(): array
{
$temporaryAttributeBag = new ComponentAttributeBag();
foreach ($this->extraModalWindowAttributes as $extraModalWindowAttributes) {
$temporaryAttributeBag = $temporaryAttributeBag->merge($this->evaluate($extraModalWindowAttributes));
}
return $temporaryAttributeBag->getAttributes();
}
public function getExtraModalWindowAttributeBag(): ComponentAttributeBag
{
return new ComponentAttributeBag($this->getExtraModalWindowAttributes());
}
}
+1
View File
@@ -16,6 +16,7 @@ abstract class MountableAction extends StaticAction implements HasLivewire
use Concerns\CanRedirect;
use Concerns\CanRequireConfirmation;
use Concerns\CanUseDatabaseTransactions;
use Concerns\HasExtraModalWindowAttributes;
use Concerns\HasForm;
use Concerns\HasInfolist;
use Concerns\HasLifecycleHooks;
@@ -11,6 +11,7 @@
'closeEventName' => 'close-modal',
'description' => null,
'displayClasses' => 'inline-block',
'extraModalWindowAttributeBag' => null,
'footer' => null,
'footerActions' => [],
'footerActionsAlignment' => Alignment::Start,
@@ -47,6 +48,8 @@
}
$closeEventHandler = filled($id) ? '$dispatch(' . \Illuminate\Support\Js::from($closeEventName) . ', { id: ' . \Illuminate\Support\Js::from($id) . ' })' : 'close()';
$modalWindowAttributes = $extraModalWindowAttributeBag ?? new \Illuminate\View\ComponentAttributeBag();
@endphp
<div
@@ -170,7 +173,7 @@
x-transition:leave-start="scale-100 opacity-100"
x-transition:leave-end="scale-95 opacity-0"
@endif
@class([
{{ $modalWindowAttributes->class([
'fi-modal-window pointer-events-auto relative row-start-2 flex w-full cursor-default flex-col bg-white shadow-xl ring-1 ring-gray-950/5 dark:bg-gray-900 dark:ring-white/10',
'fi-modal-slide-over-window ms-auto overflow-y-auto' => $slideOver,
// Using an arbitrary value instead of the h-dvh class that was added in Tailwind CSS v3.4.0
@@ -203,7 +206,7 @@
MaxWidth::Screen => 'fixed inset-0',
default => $width,
},
])
]) }}
>
@if ($heading || $header)
<div