Кнопки

# Основы

Кнопки отображаются на страницах ресурса: индексная страница, страницы с формой (создание / редактирование) и детальная страница.
Они отвечают за основные действия с элементами и являются компонентами ActionButton .

В админ-панели MoonShine есть множество методов позволяющих переопределить у ресурса как отдельную кнопку , так и целую группу .

Более подробная информация о компоненте ActionButton .

Кнопки создания, просмотра, редактирования, удаления и массового удаления вынесены в отдельные классы, чтобы применить к ним все необходимые методы и тем самым исключить дублирование, так как эти кнопки еще используются в HasMany, BelongsToMany и тд.

# Кнопка создания

Модификация

Метод modifyCreateButton() позволяет модифицировать кнопку создания нового элемента.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyCreateButton(ActionButton $button): ActionButton
{
return $button->error();
}
Переопределение

Метод getCreateButton() позволяет переопределить кнопку создания нового элемента.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\CreateButton;
 
public function getCreateButton(?string $componentName = null, bool $isAsync = false): ActionButton
{
return CreateButton::for(
$this,
componentName: $componentName,
isAsync: $isAsync
);
}

# Кнопка просмотра

Модификация

Метод modifyDetailButton() позволяет модифицировать кнопку детального просмотра элемента.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyDetailButton(ActionButton $button): ActionButton
{
return $button->warning();
}
Переопределение

Метод getDetailButton() позволяет переопределить кнопку детального просмотра элемента.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\DetailButton;
 
public function getDetailButton(bool $isAsync = false): ActionButton
{
return DetailButton::for(
$this,
isAsync: $isAsync
);
}

# Кнопка редактирования

Модификация

Метод modifyEditButton() позволяет модифицировать кнопку редактирования элемента.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyEditButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.pencil-square');
}
Переопределение

Метод getEditButton() позволяет переопределить кнопку редактирования элемента.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\EditButton;
 
public function getEditButton(?string $componentName = null, bool $isAsync = false): ActionButton
{
return EditButton::for(
$this,
componentName: $componentName,
isAsync: $isAsync
);
}

# Кнопка удаления

Модификация

Метод modifyDeleteButton() позволяет модифицировать кнопку удаления элемента.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyDeleteButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.x-mark');
}
Переопределение

Метод getDeleteButton() позволяет переопределить кнопку удаления элемента.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\DeleteButton;
 
public function getDeleteButton(
?string $componentName = null,
string $redirectAfterDelete = '',
bool $isAsync = false
): ActionButton {
return DeleteButton::for(
$this,
componentName: $componentName,
redirectAfterDelete: $isAsync ? '' : $redirectAfterDelete,
isAsync: $isAsync
);
}

# Кнопка массового удаления

Модификация

Метод modifyMassDeleteButton() позволяет модифицировать кнопку массового удаления.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyMassDeleteButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.x-mark');
}
Переопределение

Метод getMassDeleteButton() позволяет переопределить кнопку массового удаления.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\MassDeleteButton;
 
public function getMassDeleteButton(
?string $componentName = null,
string $redirectAfterDelete = '',
bool $isAsync = false
): ActionButton {
return MassDeleteButton::for(
$this,
componentName: $componentName,
redirectAfterDelete: $isAsync ? '' : $redirectAfterDelete,
isAsync: $isAsync
);
}

# Кнопка экспорта

Модификация

Метод modifyExportButton() позволяет модифицировать кнопку экспорта.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyExportButton(ActionButton $button): ActionButton
{
return $button->secondary();
}
Переопределение

Метод getExportButton() позволяет переопределить кнопку экспорта.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\ExportButton;
 
public function getExportButton(): ActionButton
{
return ExportButton::for($this, export: $this->export());
}

# Кнопка импорта

Модификация

Метод modifyImportButton() позволяет модифицировать кнопку импорта.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyImportButton(ActionButton $button): ActionButton
{
return $button->error();
}
Переопределение

Метод getImportButton() позволяет переопределить кнопку импорта.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\ImportButton;
 
public function getImportButton(): ActionButton
{
return ImportButton::for($this, import: $this->import());
}

# Кнопка фильтры

Модификация

Метод modifyFiltersButton() позволяет модифицировать кнопку фильтры.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyFiltersButton(ActionButton $button): ActionButton
{
return $button->error();
}
Переопределение

Метод getFiltersButton() позволяет переопределить кнопку фильтры.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\FiltersButton;
 
public function getFiltersButton(): ActionButton
{
return FiltersButton::for($this);
}

# Кнопки формы

Метод getFormBuilderButtons() позволяет добавить дополнительные кнопки в форму создания или редактирования.

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function getFormBuilderButtons(): array
{
return [
ActionButton::make('Back', fn() => $this->indexPageUrl())->customAttributes(['class' => 'btn-lg'])
];
}
 
//...
}

# Кнопки на индексной странице

По умолчанию на индексной странице ресурса модели присутствует только кнопка для создания.
Метод actions() позволяет добавить дополнительные кнопки .

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Enums\JsEvent;
use MoonShine\Resources\ModelResource;
use MoonShine\Support\AlpineJs;
 
class PostResource extends ModelResource
{
//...
 
public function actions(): array
{
return [
ActionButton::make('Refresh', '#')
->dispatchEvent(AlpineJs::event(JsEvent::TABLE_UPDATED, 'index-table'))
];
}
 
//...
}

# Кнопки элемента

Метод buttons() позволяет задать дополнительные кнопки, которые будут отображаться в индексной таблице, в формах создания и редактирования, а так же на детальной странице, если они не переопределены для страниц соответствующими методами indexButton() , formButtons() и detailButtons() .

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function buttons(): array
{
return [
ActionButton::make('Link', '/endpoint')
];
}
 
//...
}

# Кнопки в индексной таблице

Для добавления кнопок в индексную таблицу используется метод indexButtons().

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function indexButtons(): array
{
return [
ActionButton::make(
'Link',
fn(Model $item) => '/endpoint?id=' . $item->getKey()
)
];
}
 
//...
}

Пример создания кастомных кнопок у индексной таблицы в разделе Recipes

Для массовых действий с элементами, необходимо добавить метод bulk()

public function indexButtons(): array
{
return [
ActionButton::make('Link', '/endpoint')
->bulk()
];
}
Переопределение группы

Если требуется полностью изменить все кнопки элемента в индексной таблице, то необходимо в ресурсе переопределить метод getIndexItemButtons().

namespace MoonShine\Resources;
 
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function getIndexItemButtons(): array
{
return [
...$this->getIndexButtons(),
$this->getDetailButton(
isAsync: $this->isAsync()
),
$this->getEditButton(
isAsync: $this->isAsync()
),
$this->getDeleteButton(
redirectAfterDelete: $this->redirectAfterDelete(),
isAsync: $this->isAsync()
),
$this->getMassDeleteButton(
redirectAfterDelete: $this->redirectAfterDelete(),
isAsync: $this->isAsync()
),
];
}
 
//...
}

# Кнопки на странице с формой

Для добавления кнопок страницу с формой используется метод formButtons().

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function formButtons(): array
{
return [
ActionButton::make('Link')->method('updateSomething')
];
}
 
//...
}
Переопределение группы

Если требуется полностью изменить все кнопки элемента на странице формы, то необходимо в ресурсе переопределить метод getFormItemButtons().

namespace MoonShine\Resources;
 
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function getFormItemButtons(): array
{
return [
...$this->getFormButtons(),
$this->getDetailButton(),
$this->getDeleteButton(
redirectAfterDelete: $this->redirectAfterDelete(),
isAsync: false
),
];
}
 
//...
}

# Кнопки на детальной странице

Для добавления кнопок на детальной странице используется метод detailButtons().

namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function detailButtons(): array
{
return [
ActionButton::make('Link', '/endpoint')
];
}
 
//...
}
Переопределение группы

Если требуется полностью изменить все кнопки элемента на детальной странице, то необходимо в ресурсе переопределить метод getDetailItemButtons().

namespace MoonShine\Resources;
 
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function getDetailItemButtons(): array
{
return [
...$this->getDetailButtons(),
$this->getEditButton(
isAsync: $this->isAsync(),
),
$this->getDeleteButton(
redirectAfterDelete: $this->redirectAfterDelete(),
isAsync: false
),
];
}
 
//...
}