Данная статья является адаптацией предыдущей статьи для MoonShine v4 и выше.
Рекомендую предварительно изучить соответствующий раздел документации Laravel и подготовить модель к реализации функции "мягкого удаления".
Переопределим метод modifyItemQueryBuilder()в ресурсе для корректного получения "удаленной" модели.
protected function modifyItemQueryBuilder(
Builder $builder
): Builder
{
return $builder->withTrashed();
}
Затем добавим весь необходимый функционал в класс индексной страницы.
protected function queryTags(): array
{
return [
QueryTag::make(
'Deleted',
static fn(Builder $q) => $q->onlyTrashed()
)
];
}
protected function buttons(): ListOf
{
return parent::buttons()->prepend(
ActionButton::make('Restore')
->method(
'restore',
events: [$this->getListEventName()]
)
->canSee(
fn(Article $model) => $model->trashed()
),
ActionButton::make('Force delete')
->method(
'forceDelete',
events: [$this->getListEventName()]
)
->canSee(
fn(Article $model) => $model->trashed()
),
);
}
#[AsyncMethod]
public function restore(
CrudRequestContract $request
): JsonResponse
{
$item = $request->getResource()->getItem();
$item->restore();
return JsonResponse::make()
->toast('Success');
}
#[AsyncMethod]
public function forceDelete(
CrudRequestContract $request
): JsonResponse
{
$item = $request->getResource()->getItem();
$item->forceDelete();
return JsonResponse::make()
->toast('Success');
}
protected function modifyDeleteButton(
ActionButtonContract $button
): ActionButtonContract
{
return $button->canSee(
fn(Article $model) => !$model->trashed()
);
}
protected function modifyMassDeleteButton(
ActionButtonContract $button
): ActionButtonContract
{
return $button->canSee(
fn() => request()->input('query-tag') !== 'deleted'
);
}
Готово!
Оставить комментарий
