Расширяет MoonShineComponent
- имеет те же функции
Основы
Когда вам нужно добавить кнопку с определенным действием, на помощь приходят ActionButtons.
В MoonShine они уже используются - в формах, таблицах, на страницах.
ActionButton::make( Closure|string $label, Closure|string|null $url = null, mixed $item = null)
label
- текст кнопки,url
- URL ссылки кнопки,item
- опциональные данные кнопки, доступные в замыканиях.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Заголовок кнопки', url: 'https://moonshine-laravel.com', ) ];}
Также доступен хелпер, который можно использовать в Blade:
<div> {!! actionBtn('Нажми меня', 'https://moonshine-laravel.com') !!}</div>
Открытие в новом окне
Метод blank()
позволяет открыть URL в новом окне.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: '/', ) ->blank() ];}
Иконка
Метод icon()
позволяет указать иконку для кнопки.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: fn() => 'Нажми меня', url: 'https://moonshine-laravel.com', ) ->icon('heroicons.outline.pencil') ];}
Для получения более подробной информации обратитесь к разделу Иконки.
Цвет
Для ActionButton
есть набор методов, которые позволяют установить цвет кнопки:
primary()
, secondary()
, warning()
, success()
и error()
.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: fn() => 'https://moonshine-laravel.com', ) ->primary() ];}
Бейдж
Метод badge()
позволяет добавить бейдж к кнопке.
badge(Closure|string|int|float|null $value)
use MoonShine\ActionButtons\ActionButton; //... ActionButton::make('Кнопка') ->badge(fn() => Comment::count()) //...
onClick
Метод onClick
позволяет выполнить js-код при клике:
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: 'https://moonshine-laravel.com', ) ->onClick(fn() => "alert('Пример')", 'prevent') ];}
Модальное окно
Основы
Для вызова модального окна при нажатии на кнопку используйте метод inModal()
.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: 'https://moonshine-laravel.com', ) ->inModal( title: fn() => 'Заголовок модального окна', content: fn() => 'Содержимое модального окна', buttons: [ ActionButton::make('Нажми меня в модальном окне', 'https://moonshine-laravel.com') ], async: false ) ];}
title
- заголовок модального окна,content
- содержимое модального окна,buttons
- кнопки модального окна,async
- асинхронный режим,wide
- максимальная ширина модального окна,auto
- ширина модального окна по содержимому,closeOutside
- закрытие модального окна при клике вне области окна,attributes
- дополнительные атрибуты,autoClose
- автоматическое закрытие модального окна после успешного запроса.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: 'https://moonshine-laravel.com', ) ->inModal( title: fn() => 'Заголовок модального окна', content: fn() => 'Содержимое модального окна', buttons: [ ActionButton::make('Нажми меня в модальном окне', 'https://moonshine-laravel.com') ], async: false ) ];}
Вы также можете открыть модальное окно с помощью метода toggleModal
, а если ActionButton находится внутри модального окна, то просто openModal
use MoonShine\ActionButtons\ActionButton;use MoonShine\Components\Modal; public function components(): array{ return [ MoonShine\Components\Modal::make( 'Заголовок', fn() => 'Содержимое', )->name('my-modal') ActionButton::make( label: 'Открыть модальное окно', url: '#', )->toggleModal('my-modal') ];}
Асинхронный режим
Если вам нужно загрузить содержимое в модальное окно асинхронно, то переключите параметр async на true
.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: to_page('action_button', fragment: 'doc-content'), ) ->inModal( title: fn() => 'Заголовок модального окна', async: true ) ];}
О Fragment можно узнать в разделе "Компоненты"
Подтверждение
Метод withConfirm()
позволяет создать кнопку с подтверждением действия.
ActionButton::make( label: 'Нажми меня', url: 'https://moonshine-laravel.com',) ->withConfirm( 'Заголовок модального окна подтверждения', 'Содержимое модального окна подтверждения', 'Кнопка модального окна подтверждения', )
Боковая панель
Для того чтобы при нажатии на кнопку вызывалась боковая панель, используйте метод inOffCanvas()
.
use MoonShine\ActionButtons\ActionButton; public function components(): array{ return [ ActionButton::make( label: 'Нажми меня', url: 'https://moonshine-laravel.com', ) ->inOffCanvas( fn() => 'Заголовок боковой панели', fn() => form()->fields([Text::make('Текст')]), isLeft: false ) ];}
Группировка
Если вам нужно выстроить логику с несколькими ActionButton
, однако некоторые должны быть скрыты или отображены в выпадающем меню, в этом случае используйте компонент ActionGroup
.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Components\ActionGroup; public function components(): array{ return [ ActionGroup::make([ ActionButton::make('Кнопка 1', '/')->canSee(fn() => false), ActionButton::make('Кнопка 2', '/', $model)->canSee(fn($model) => $model->active) ]) ];}
Отображение
Благодаря ActionGroup вы также можете изменить отображение кнопок, отображать их в линию или в выпадающем меню для экономии места.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Components\ActionGroup; public function components(): array{ return [ ActionGroup::make([ ActionButton::make('Кнопка 1', '/')->showInLine(), ActionButton::make('Кнопка 2', '/')->showInDropdown() ]) ];}
Массовые действия
Метод bulk()
позволяет создать кнопку массового действия для ModelResource.
public function indexButtons(): array{ return [ ActionButton::make('Ссылка', '/endpoint')->bulk(), ];}
Метод bulk()
, используется только внутри ModelResource.
Асинхронный режим
Метод async()
позволяет реализовать асинхронную работу для ActionButton
.
async( string $method = 'GET', ?string $selector = null, array $events = [] ?string $callback = null)
$method
- метод асинхронного запроса,$selector
- селектор элемента, содержимое которого изменится,$events
- события, поднимаемые после успешного запроса,$callback
- js функция обратного вызова после получения ответа.
public function components(): array{ return [ ActionButton::make( 'Нажми меня', '/endpoint' ) ->async() ];}
Уведомления
Если вам нужно отобразить уведомление или сделать редирект после клика, то достаточно реализовать json ответ согласно структуре:
{message: 'Toast', messageType: 'success', redirect: '/url'}
Параметр redirect
является необязательным.
HTML содержимое
Если вам нужно заменить область html по клику, то можно вернуть HTML содержимое или json с ключом html в ответе:
{"html": "Html content"}
public function components(): array{ return [ ActionButton::make( 'Нажми меня', '/endpoint' ) ->async(selector: '#my-selector') ];}
События
После успешного запроса вы можете поднять события:
public function components(): array{ return [ ActionButton::make( 'Нажми меня', '/endpoint' ) ->async(events: ['table-updated-index-table']) ];}
Для работы события table-updated-index-table
должен быть включен асинхронный режим.
Обратный вызов
Если вам нужно обработать ответ иным способом, необходимо реализовать функцию-обработчик и указать ее в методе async()
.
public function components(): array{ return [ ActionButton::make( 'Нажми меня', '/endpoint' ) ->async(callback: 'myFunction') ];}
document.addEventListener("moonshine:init", () => { MoonShine.onCallback('myFunction', function(response, element, events, component) { if(response.confirmed === true) { component.$dispatch('toast', {type: 'success', text: 'Успех'}) } else { component.$dispatch('toast', {type: 'error', text: 'Ошибка'}) } })})
Вызов методов
method()
позволяет указать имя метода в ресурсе и вызвать его асинхронно при нажатии на ActionButton
без необходимости создания дополнительных контроллеров.
method( string $method, array|Closure $params = [], ?string $message = null, ?string $selector = null, array $events = [], string|AsyncCallback|null $callback = null, ?Page $page = null, ?ResourceContract $resource = null)
$method
- имя метода,$params
- параметры для запроса,$message
- сообщения,$selector
- селектор элемента, содержимое которого изменится,$events
- события, которые будут вызваны после успешного запроса,$callback
- js функция обратного вызова после получения ответа,$page
- страница, содержащая метод,$resource
- ресурс, содержащий метод.
public function components(): array{ return [ ActionButton::make('Нажми меня') ->method('updateSomething'), ];}
// С уведомлениемpublic function updateSomething(MoonShineRequest $request){ // $request->getResource(); // $request->getResource()->getItem(); // $request->getPage(); MoonShineUI::toast('МоеСообщение', 'success'); return back();} // Исключениеpublic function updateSomething(MoonShineRequest $request){ throw new \Exception('Мое сообщение');} // Пользовательский JSON-ответpublic function updateSomething(MoonShineRequest $request){ return MoonShineJsonResponse::make()->toast('МоеСообщение', ToastType::SUCCESS);}
Методы, вызываемые через ActionButton
в ресурсе, должны быть публичными!
Для доступа к данным из запроса вы должны передать их в параметрах.
Передача текущего элемента
Если в запросе присутствует resourceItem, вы можете получить доступ к текущему элементу в ресурсе через метод getItem()
.
- Когда в данных есть модель, и кнопка создается в методе
buttons()
TableBuilder, CardsBuilder или FormBuilder, она автоматически заполняется данными, и параметры будут содержатьresourceItem
. - Когда кнопка находится на странице формы ModelResource, вы можете передать id текущего элемента.
ActionButton::make('Нажми меня') ->method( 'updateSomething', params: ['resourceItem' => $this->getResource()->getItemID()] )
- Когда кнопка находится в индексной таблице ModelResource, нужно использовать замыкание
ActionButton::make('Нажми меня') ->method( 'updateSomething', params: fn($item) => ['resourceItem' => $item->getKey()] )
Значения полей
Метод withParams()
позволяет передавать значения полей с запросом, используя селекторы элементов.
ActionButton::make('Асинхронный метод') ->method('updateSomething') ->withParams([ 'alias' => '[data-column="title"]', 'slug' => '#slug' ]),
use MoonShine\Http\Responses\MoonShineJsonResponse;use MoonShine\MoonShineRequest; public function updateSomething(MoonShineRequest $request): MoonShineJsonResponse{ return MoonShineJsonResponse::make() ->toast($request->get('slug', 'Ошибка'));}
При использовании метода withParams()
запросы будут отправляться через POST
.
Скачивание
Вызываемый метод может возвращать BinaryFileResponse
, что позволяет скачать файл.
ActionButton::make('Скачать')->method('download')
public function download(): BinaryFileResponse{ // ... return response()->download($file);}
Отправка событий
Для отправки javascript-событий вы можете использовать метод dispatchEvent()
.
dispatchEvent(array|string $events)
ActionButton::make('Обновить', '#') ->dispatchEvent(AlpineJs::event(JsEvent::TABLE_UPDATED, 'index-table')),
По умолчанию при вызове события с запросом будут отправлены все query параметры из href у ActionButton.
Некоторые исключить можно через параметр exclude
:
->dispatchEvent( AlpineJs::event(JsEvent::TABLE_UPDATED, 'index-table'), exclude: ['something'])
Также можно полностью исключить отправку withoutPayload
:
->dispatchEvent( AlpineJs::event(JsEvent::TABLE_UPDATED, 'index-table'), withoutPayload: true)