To achieve the desired functionality of filtering by warehouse location first and then by receipt status, you can use a combination of dropdown filters and tabs. Here's a step-by-step solution:
- Add a Dropdown Filter for Warehouse Locations: This will allow users to select a warehouse location first.
- Modify the Tabs to Respect the Selected Warehouse Location: The tabs will then filter the receipts based on both the selected warehouse location and the receipt status.
Here's how you can implement this:
Step 1: Add a Dropdown Filter for Warehouse Locations
First, add a dropdown filter for warehouse locations in your ListReceipts class.
namespace App\Filament\Resources\ReceiptResource\Pages;
use App\Filament\Resources\ReceiptResource;
use App\Models\Receipt;
use App\Models\ReceiptStatus;
use App\Models\Warehouse;
use Filament\Actions;
use Filament\Resources\Components\Tab;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListReceipts extends ListRecords
{
protected static string $resource = ReceiptResource::class;
protected function getFilters(): array
{
return [
SelectFilter::make('warehouse')
->label('Warehouse')
->options(Warehouse::all()->pluck('name', 'id'))
->query(function (Builder $query, $value) {
$query->where('warehouse_id', $value);
}),
];
}
public function getTabs(): array
{
$warehouseId = request()->query('filters')['warehouse'] ?? null;
return [
'all' => Tab::make('All Receipts')
->query(fn (Builder $query) => $warehouseId ? $query->where('warehouse_id', $warehouseId) : $query)
->badge($warehouseId ? Receipt::where('warehouse_id', $warehouseId)->count() : Receipt::count()),
'goods_inwards' => Tab::make('Goods Inwards')
->query(fn (Builder $query) => $query->where('receipt_status_id', ReceiptStatus::where('name', 'Goods Inwards')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId)))
->badge(Receipt::where('receipt_status_id', ReceiptStatus::where('name', 'Goods Inwards')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId))->count()),
'gi_processing' => Tab::make('GI Processing')
->query(fn (Builder $query) => $query->where('receipt_status_id', ReceiptStatus::where('name', 'GI Processing')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId)))
->badge(Receipt::where('receipt_status_id', ReceiptStatus::where('name', 'GI Processing')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId))->count()),
'corrective_action' => Tab::make('Corrective Action')
->query(fn (Builder $query) => $query->where('receipt_status_id', ReceiptStatus::where('name', 'Corrective Action')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId)))
->badge(Receipt::where('receipt_status_id', ReceiptStatus::where('name', 'Corrective Action')->first()->id)
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId))->count()),
'archive' => Tab::make('Archive')
->query(fn (Builder $query) => $query->onlyTrashed()
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId)))
->badge(Receipt::onlyTrashed()
->when($warehouseId, fn ($query) => $query->where('warehouse_id', $warehouseId))->count()),
];
}
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}
Explanation:
-
Dropdown Filter: The
getFiltersmethod adds a dropdown filter for selecting a warehouse. TheSelectFilteris used to create the dropdown, and thequerymethod is used to filter the receipts based on the selected warehouse. -
Tabs with Conditional Queries: The
getTabsmethod is modified to respect the selected warehouse location. Thewhenmethod is used to conditionally apply the warehouse filter to each tab's query.
This way, users can first select a warehouse location from the dropdown filter, and then the tabs will filter the receipts based on both the selected warehouse location and the receipt status.