- Основы
- События
- Состояние по умолчанию
- Клик вне окна
- Автозакрытие
- Ширина
- Асинхронность
- Внешние атрибуты
- Blade
Основы
Компонент Modal
позволяет создавать модальные окна.
Вы можете создать Modal
, используя статический метод make()
.
make(Closure|string $title = '',protected Closure|Renderable|string $content = '',protected Closure|Renderable|ActionButtonContract|string $outer = '',protected Closure|string|null $asyncUrl = null,iterable $components = [],)
make(Closure|string $title = '',protected Closure|Renderable|string $content = '',protected Closure|Renderable|ActionButtonContract|string $outer = '',protected Closure|string|null $asyncUrl = null,iterable $components = [],)
$title
- заголовок модального окна,$content
- содержимое модального окна,$outer
- внешний блок с обработчиком вызова окна,$asyncUrl
- url для асинхронного контента,$components
- компоненты для модального окна.
use MoonShine\UI\Components\Modal;Modal::make(title: 'Подтвердить',content: 'Содержимое')
use MoonShine\UI\Components\Modal;Modal::make(title: 'Подтвердить',content: 'Содержимое')
<x-moonshine::modal title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modal title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
Параметр content
- это текстовое содержимое Modal. Подходит для отображения простой информации (строк, HTML и т.д.).
Однако, если вы хотите встроить в Modal компоненты (например, поля или формы, реагирующие на изменение значений, реактивность и т.д.),
важно понимать, что MoonShine не сможет "увидеть" такие компоненты, переданные как строка.
Это ограничивает функциональность.
Чтобы MoonShine корректно обрабатывал поля внутри Modal, необходимо передать их в параметре components
.
Если вы строите контент Modal исключительно на компонентах MoonShine (поля, формы и т.д.), используйте параметр components
вместо content
.
События
Вы можете открывать или закрывать модальное окно, не используя компонент, через события javascript
.
Чтобы иметь доступ к событиям, вы должны установить уникальное имя для модального окна, используя метод name()
.
use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Components\Modal;// ...protected function components(): iterable{return [Modal::make('Заголовок','Содержимое',)->name('my-modal'),];}// ...
use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Components\Modal;// ...protected function components(): iterable{return [Modal::make('Заголовок','Содержимое',)->name('my-modal'),];}// ...
Вызов события через ActionButton
Событие модального окна может быть вызвано с помощью компонента ActionButton
.
Modal::make('Заголовок','Содержимое',)->name('my-modal'),ActionButton::make('Показать модальное окно')->toggleModal('my-modal')// или асинхронноActionButton::make('Показать модальное окно','/endpoint')->async(events: [AlpineJs::event(JsEvent::MODAL_TOGGLED, 'my-modal')])
Modal::make('Заголовок','Содержимое',)->name('my-modal'),ActionButton::make('Показать модальное окно')->toggleModal('my-modal')// или асинхронноActionButton::make('Показать модальное окно','/endpoint')->async(events: [AlpineJs::event(JsEvent::MODAL_TOGGLED, 'my-modal')])
Вызов события с использованием нативных методов
События могут быть вызваны с использованием нативных методов javascript:
document.addEventListener("DOMContentLoaded", () => {this.dispatchEvent(new CustomEvent("modal_toggled:my-modal"))})
document.addEventListener("DOMContentLoaded", () => {this.dispatchEvent(new CustomEvent("modal_toggled:my-modal"))})
Вызов события с использованием метода Alpine.js
Или с использованием магического метода $dispatch()
из *alpine.js
:
this.$dispatch('modal_toggled:my-modal')
this.$dispatch('modal_toggled:my-modal')
Вызов события с использованием глобального класса MoonShine
MoonShine.ui.toggleModal('my-modal')
MoonShine.ui.toggleModal('my-modal')
Открытие/Закрытие
Вы также можете добавить события при открытии/закрытии модального окна через метод toggleEvents
toggleEvents(array $events, bool $onlyOpening = false, $onlyClosing = false)
toggleEvents(array $events, bool $onlyOpening = false, $onlyClosing = false)
ActionButton::make('Open modal')->toggleModal('my-modal'),Modal::make('My modal', asyncUrl: '/')->name('my-modal')->toggleEvents([AlpineJs::event(JsEvent::TOAST, params: ['text' => 'Hello'])], onlyOpening: false, onlyClosing: true),
ActionButton::make('Open modal')->toggleModal('my-modal'),Modal::make('My modal', asyncUrl: '/')->name('my-modal')->toggleEvents([AlpineJs::event(JsEvent::TOAST, params: ['text' => 'Hello'])], onlyOpening: false, onlyClosing: true),
Параметры onlyOpening
и onlyClosing
позволяют настраивать, будут ли события срабатывать при открытии и закрытии. По умолчанию оба параметра установлены в TRUE
, что означает, что список событий будет вызываться как при открытии боковой панели, так и при её закрытии.
Состояние по умолчанию
Метод open()
позволяет открыть модальное окно при загрузке страницы.
open(Closure|bool|null $condition = null)
open(Closure|bool|null $condition = null)
Modal::make('Заголовок', 'Содержимое...', view('path'))->open(),
Modal::make('Заголовок', 'Содержимое...', view('path'))->open(),
По умолчанию модальное окно останется закрытым при загрузке страницы.
Клик вне окна
По умолчанию модальное окно закрывается при клике вне области окна. Метод closeOutside()
позволяет переопределить это поведение.
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->closeOutside(false),
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->closeOutside(false),
Автозакрытие
По умолчанию модальные окна закрываются после успешного запроса (к примеру при отправке формы). Метод autoClose()
позволяет управлять этим поведением.
autoClose(Closure|bool|null $autoClose = null)
autoClose(Closure|bool|null $autoClose = null)
Modal::make('Демо модальное окно',static fn() => FormBuilder::make(route('alert.post'))->fields([Text::make('Текст'),])->submit('Отправить', ['class' => 'btn-primary'])->async(),)->name('demo-modal')->autoClose(false),
Modal::make('Демо модальное окно',static fn() => FormBuilder::make(route('alert.post'))->fields([Text::make('Текст'),])->submit('Отправить', ['class' => 'btn-primary'])->async(),)->name('demo-modal')->autoClose(false),
Ширина
wide
Метод wide()
компонента Modal устанавливает максимальную ширину модального окна.
wide(Closure|bool|null $condition = null)
wide(Closure|bool|null $condition = null)
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->wide(),
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->wide(),
auto
Метод auto()
компонента Modal устанавливает ширину модального окна на основе содержимого.
auto(Closure|bool|null $condition = null)
auto(Closure|bool|null $condition = null)
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->auto(),
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->auto(),
Асинхронность
Modal::make('Заголовок', '', ActionButton::make('Показать модальное окно', '#'), asyncUrl: '/endpoint'),
Modal::make('Заголовок', '', ActionButton::make('Показать модальное окно', '#'), asyncUrl: '/endpoint'),
Запрос будет отправлен один раз, но если вам нужно отправлять запрос при каждом открытии, то используйте метод alwaysLoad
Modal::make(...)->alwaysLoad(),
Modal::make(...)->alwaysLoad(),
Внешние атрибуты
Метод outerAttributes()
позволяет установить дополнительные атрибуты для внешнего блока $outer
.
outerAttributes(array $attributes)
outerAttributes(array $attributes)
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->outerAttributes(['class' => 'mt-2']),
Modal::make('Заголовок', 'Содержимое...', ActionButton::make('Показать модальное окно', '#'))->outerAttributes(['class' => 'mt-2']),
Blade
Для создания модальных окон используется компонент moonshine::modal
.
<x-moonshine::modal title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modal title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
Широкое окно
Параметр wide
позволяет модальным окнам заполнять всю ширину.
<x-moonshine::modal wide title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open wide modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modal wide title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open wide modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
Автоматическая ширина
Параметр auto
позволяет модальным окнам занимать ширину на основе содержимого.
<x-moonshine::modal auto title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open auto modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modal auto title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open auto modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
Закрытие окна
По умолчанию модальные окна закрываются при клике вне области окна. Вы можете переопределить это поведение с помощью параметра closeOutside
.
<x-moonshine::modal :closeOutside="false" title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modal :closeOutside="false" title="Title"><div>Content...</div><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
Асинхронный контент
Компонент moonshine::modal
позволяет загружать контент асинхронно.
<x-moonshine::modalasync:asyncUrl="route('async')"title="Title"><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open async modal</x-moonshine::link-button></x-slot></x-moonshine::modal>
<x-moonshine::modalasync:asyncUrl="route('async')"title="Title"><x-slot name="outerHtml"><x-moonshine::link-button @click.prevent="toggleModal">Open async modal</x-moonshine::link-button></x-slot></x-moonshine::modal>