Sometimes, your Customer might get deleted for various reasons, but you might need to recover them months later. In Laravel, it's about SoftDeletes, but in the Filament version, we will show it as an Archived tab with a Restore button:

In this lesson, we will do the following:
Archived tab to the Customers tableDelete button to the tableRestore button to the Archived tabArchived tabThe first thing to do is add the missing Delete button to our form:
app/Filament/Resources/CustomerResource.php
// ... public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->filters([ // ]) ->actions([ Tables\Actions\EditAction::make(), Tables\Actions\DeleteAction::make(), // ... ]) ->bulkActions([ // ... ]);} // ...
That's it. Now we have a delete button in our table:

Now that we can delete our customers, we must see them somewhere. Let's add an Archived tab to our table:
app/Filament/Resources/CustomerResource/Pages/ListCustomers.php
// ... public function getTabs(): array{ $tabs = []; $tabs['all'] = Tab::make('All Customers') ->badge(Customer::count()); $pipelineStages = PipelineStage::orderBy('position')->withCount('customers')->get(); foreach ($pipelineStages as $pipelineStage) { $tabs[str($pipelineStage->name)->slug()->toString()] = Tab::make($pipelineStage->name) ->badge($pipelineStage->customers_count) ->modifyQueryUsing(function ($query) use ($pipelineStage) { return $query->where('pipeline_stage_id', $pipelineStage->id); }); } $tabs['archived'] = Tab::make('Archived') ->badge(Customer::onlyTrashed()->count()) ->modifyQueryUsing(function ($query) { return $query->onlyTrashed(); }); return $tabs;} // ...
This will add an Archived tab to our table:

We currently have 2 Customers here, but as you can see - there is an Edit button and a Move to Stage button. We don't want that, so let's hide them on this tab:
app/Filament/Resources/CustomerResource.php
// ... public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->filters([ // ]) ->actions([ Tables\Actions\EditAction::make() ->hidden(fn($record) => $record->trashed()), Tables\Actions\DeleteAction::make(), Tables\Actions\Action::make('Move to Stage') ->hidden(fn($record) => $record->trashed()) ->icon('heroicon-m-pencil-square') ->form([ // ... ]) ->action(function (Customer $customer, array $data): void { // ... }), ]) ->bulkActions([ // ... ]);} // ...
We have now hidden the Edit and Move to Stage buttons by adding a condition to check if they are trashed or not. This gives us the following result:

If you visit the Archived tab and click on a row, you will get an error like this:

This happens because we have deleted the record previously, but now we are trying to edit it. To prevent this, we can add the following code to our table:
app/Filament/Resources/CustomerResource.php
// ... public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->filters([ // ]) ->actions([ // ... ]) ->recordUrl(function ($record) { // If the record is trashed, return null if ($record->trashed()) { // Null will disable the row click return null; } // Otherwise, return the edit page URL return Pages\EditCustomer::getUrl([$record->id]); }) ->bulkActions([ // ... ]);} // ...
Clicking the row will not do anything in the Archived tab but will point to the Edit page in all other tabs.
The last thing to do is add a Restore button:
app/Filament/Resources/CustomerResource.php
// ... public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->filters([ // ]) ->actions([ Tables\Actions\EditAction::make() ->hidden(fn($record) => $record->trashed()), Tables\Actions\DeleteAction::make(), Tables\Actions\RestoreAction::make(), Tables\Actions\Action::make('Move to Stage') ->hidden(fn($record) => $record->trashed()) ->icon('heroicon-m-pencil-square') ->form([ // ... ]) ->action(function (Customer $customer, array $data): void { // ... }), ]) ->bulkActions([ Tables\Actions\DeleteBulkAction::make() ->hidden(function (Pages\ListCustomers $livewire) { return $livewire->activeTab == 'archived'; }), Tables\Actions\RestoreBulkAction::make() ->hidden(function (Pages\ListCustomers $livewire) { return $livewire->activeTab != 'archived'; }), ]);} // ...
This will add the button to the end of the table:

And if you are wondering why we did not add ->hidden(...) to the button - Filament handles that for us. If the record is not trashed - the button will not be shown:

That's it. In the next lesson, we will be building a Customer View page.