Отображать действие в виде выпадающего списка для определенных строк с помощью Laravel Nova

#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 ).