#laravel-nova
Вопрос:
После того, как я создаю действие и использую onlyOnTableRow
флаг, оно отображается в виде кнопки и отображается в каждой отдельной строке. Цель этой кнопки-изменить статус строки с pending
на approved
или declined
. Теперь я хотел бы использовать раскрывающийся список, а не кнопка, а не две кнопки (один для approve
и один для decline
) и также я хотел бы, чтобы отобразить эти кнопки или, по крайней мере, доступна только для тех строк, в которых информация о состоянии pending
, в противном случае кнопка выпадающего должен быть отключен (или скрытый, не имеет значения).
// ApproveVacation.php
class ApproveVacation extends Action
{
use InteractsWithQueue, Queueable;
public function handle(ActionFields $fields, Collection $models)
{
foreach($models as $model) {
$model->update([
'status' => 'approved'
]);
}
return Action::message('Successfully approved!');
}
public function fields()
{
return [];
}
}
//Vacation.php
class Vacation extends Resource
{
...
public function actions(Request $request)
{
return [
(new ApproveVacation())->onlyOnTableRow()
];
}
}
Ответ №1:
Итак, вот как я решил эту проблему. Я не смог найти способ вставить выпадающий список в строку, но это решение достаточно близко:
// ApproveVacation.php
class ApproveVacation extends Action
{
use InteractsWithQueue, Queueable;
public function handle(ActionFields $fields, Collection $models)
{
foreach($models as $model) {
$model->update([
'status' => $fields->status
]);
}
return Action::message('Status has been successfully updated!');
}
public function fields()
{
return [
Select::make('Status')->options([
'approved' => 'Approve',
'declined' => 'Decline',
])->default(function ($request) {
return 'approved';
})
];
}
}
//Vacation.php
class Vacation extends Resource
{
...
public function actions(Request $request)
{
return [
(new UpdateVacationStatus())->onlyOnTableRow()->canSee(function ($request) {
if ($request instanceof ActionRequest) {
return false;
}
return $this->resource instanceof Model amp;amp; $this->resource->status == 'pending';
})
];
}
}
Этот код добавит кнопку, которая будет отображаться модально при нажатии. В модальном режиме будет одно поле, оно есть Status
, и оно будет выпадающим (потому что оно задано Select
как тип).
Кроме того, чтобы избежать отображения кнопки для каждого поля, я добавил условие внутри actions
функции. Это проверка того, что один раз переданный параметр имеет тип Model
, который означал бы, что параметр представляет строку из таблицы, и только тогда вы можете проверить наличие других необходимых вам условий (для меня это было проверить, есть ли status
pending
).