- Основы
- События
- Состояние по умолчанию
- Клик вне окна
- Автозакрытие
- Ширина
- Асинхронность
- Внешние атрибуты
- 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>