#How to get all options from table filter in table header action?

9 messages · Page 1 of 1 (latest)

warm kraken
#

I've created a custom filter form for a table on a relation page (i.e. a class which extends ManageRelatedRecords). I have a Select component as part of the filter form and this is populated with a list of projects.

Within a table header action, I'd like to retrieve the list of projects (i.e. Select options), in order to provide navigation to one of the projects in the list. Unfortunately, I'm struggling to access the Select component, so would be grateful to be pointed in the right direction.

public function table(Table $table): Table
{
  return $table
    ->columns([ 
      // ...
    ])
    ->filters([
      Filter::make('client_project')
        ->form([
          Select::make('client_id'),
          Select::make('project_id')
        ])
        ->query(function (Builder $query, array $data) {
          // ...
        }),
    ])
    ->headerActions([
      Tables\Actions\Action::make('next-project')
        ->url(function (\Livewire\Component $livewire): string {
          $filters = $livewire->getTable()->getFilters();
          dd($filters['client_project']);
          // how do I retrieve all of the options listed in the 'project_id' Select component?
        })
    ]);
}
uncut trenchBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> ✅ Mark Solution

scarlet harbor
#

What are you trying to achieve?

Tables\Actions\Action::make('next-project')
  ->action(function (\Livewire\Component $livewire): string { // Changed to 'action' instead of 
    $filters = $livewire->getTable()->getFilters();
    dd($filters['client_project']->getState());
  })

The above should give you the filter values.

warm kraken
#

I'm trying to get the full list of options from the project_id Select component (not the currently selected option, which ->getState() returns), so that I can decide which id from the list should be used to build a URL to navigate to. I'm guessing I need to use the ->getOptions() method, but I'm not sure how I get access to the Select component.

#

I was trying to avoid executing another database query, as the list of relevant project id's already exists in the Select component's list of options.

scarlet harbor
warm kraken
#

Unfortunately, the client_id and project_id components are dependent Selects, so the latter is dynamically populated based on the former...

#
                             Select::make('project_id')
  ->relationship('project', 'number', modifyQueryUsing: function (Builder $query, Get $get) {
    return $query
      ->where('client_id', $get('client_id'))
      ->orderBy('number', 'desc');
  })
warm kraken
#

I've finally managed to get hold of the list of Select options. I had to modify the creation of the project_id Select component slightly by adding ->key('project') . Then, in the header action, the following code gave me an array of the options...

Tables\Actions\Action::make('next-project')
  ->action(function (\Livewire\Component $livewire): string {  
    $filters = $livewire->getTable()->getFilters();
    $filter = $filters['client_project'];
    dd($filter->getForm()->getComponent('project')->getOptions());
  })