How to avoid widget hidden when selecting Date filter? I have this Merchant Dashboard (widgets) if the route is dashboard only MerchantAdmin can view but on the StorePerformance page SuperAdmin, Admin and MerchantAdmin can view
public static function canView(): bool
{
$user = auth()->user();
if(request()->routeIs('filament.admin.pages.dashboard')){
return $user->role === Role::MerchantAdmin;
}elseif(request()->routeIs('filament.admin.pages.store-performance')){
return in_array($user->role, [
Role::SuperAdmin,
Role::Admin,
Role::MerchantAdmin,
]);
}
return false;
}
@anonymouse703 So what is the issue? Isn't that working? It seems correct to me!
However, I suggest this clean approach for you:
public static function canView(): bool
{
$user = auth()->user();
$role = $user?->role;
if (! $role) {
return false;
}
if (request()->routeIs('filament.admin.pages.dashboard')) {
return $role === Role::MerchantAdmin;
}
if (request()->routeIs('filament.admin.pages.store-performance')) {
return in_array($role, [
Role::SuperAdmin,
Role::Admin,
Role::MerchantAdmin,
], true);
}
return false;
}
@tisuchi the problem is this routeIs() since when you click the filter action then the request is through ajax (component) and not the route anymore
page code
<?php
namespace App\Filament\Admin\Pages;
use Carbon\Carbon;
use App\Enums\User\Role;
use App\Models\Merchant;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Auth;
use Filament\Forms\Components\Select;
use App\Filament\Admin\Widgets\SalesChart;
use App\Filament\Admin\Widgets\MerchantStats;
use Filament\Forms\Components\DateTimePicker;
use App\Filament\Admin\Widgets\ProductsAvailed;
use Filament\Pages\Dashboard\Actions\FilterAction;
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
class StorePerformance extends Page
{
use HasFiltersForm;
public string $startDate;
public string $endDate;
public ?int $merchantId = null;
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.admin.pages.store-performance';
protected static ?int $navigationSort = 6;
public static function canAccess(): bool
{
$user = auth()->user();
return in_array($user->role, [Role::SuperAdmin, Role::Admin]);
}
public function mount(): void
{
$this->form->fill([
'startDate' => request()->input('filters.startDate', now()->startOfMonth()),
'endDate' => request()->input('filters.endDate', now()->endOfDay()),
'merchant_id' => Auth::user()->merchant_id,
]);
}
protected function getHeaderActions(): array
{
$user = Auth::user();
$merchantId = $user->merchant_id;
$isLocked = filled($merchantId);
return [
FilterAction::make()
->label('Filter')
->form([
Select::make('merchant_id')
->label('Merchant')
->options(fn () => Merchant::pluck('name', 'id'))
->searchable()
->preload()
->default($merchantId)
->disabled($isLocked),
DateTimePicker::make('startDate')
->default(now()->startOfMonth()),
DateTimePicker::make('endDate')
->default(now()->endOfDay()),
])
->action(function (array $data): void {
$this->filters = $data;
})
];
}
protected function getFooterWidgets(): array
{
return [
MerchantStats::make([
'filters' => $this->filters,
]),
SalesChart::make(),
];
}
}
@anonymouse703 I see, how about this approach?
public static function canView(): bool
{
$user = auth()->user();
$role = $user?->role;
if (! $role) {
return false;
}
$page = filament()->getCurrentPage();
if ($page instanceof \App\Filament\Admin\Pages\Dashboard) {
return $role === Role::MerchantAdmin;
}
if ($page instanceof \App\Filament\Admin\Pages\StorePerformance) {
return in_array($role, [
Role::SuperAdmin,
Role::Admin,
Role::MerchantAdmin,
], true);
}
return false;
}
Please sign in or create an account to participate in this conversation.