From ebdefec6646e62b946432f7e8318e042c8687e38 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 13 May 2026 17:50:44 +0100 Subject: [PATCH 1/2] Hide clear cache button on simple pages --- src/FilamentClearCachePlugin.php | 51 ++++++++++- tests/Unit/FilamentClearCachePluginTest.php | 95 ++++++++++++++++++++- 2 files changed, 139 insertions(+), 7 deletions(-) diff --git a/src/FilamentClearCachePlugin.php b/src/FilamentClearCachePlugin.php index bb283b1..9ca7603 100644 --- a/src/FilamentClearCachePlugin.php +++ b/src/FilamentClearCachePlugin.php @@ -6,6 +6,8 @@ use CmsMulti\FilamentClearCache\Http\Livewire\ClearCache; use Composer\InstalledVersions; use Filament\Contracts\Plugin; +use Filament\Facades\Filament; +use Filament\Pages\SimplePage; use Filament\Panel; use Illuminate\Support\Facades\Blade; use Livewire\Livewire; @@ -20,11 +22,25 @@ class FilamentClearCachePlugin implements Plugin const VERSION = '3.0.1'; + protected bool $hiddenOnSimplePages = true; + public static function make(): static { return app(static::class); } + public function hiddenOnSimplePages(bool $condition = true): static + { + $this->hiddenOnSimplePages = $condition; + + return $this; + } + + public function isHiddenOnSimplePages(): bool + { + return $this->hiddenOnSimplePages; + } + public function getId(): string { return static::ID; @@ -44,10 +60,12 @@ public function register(Panel $panel): void $panel->renderHook( name: 'panels::user-menu.before', - hook: fn (): string => Blade::render( - '@livewire($component)', - ['component' => $component] - ), + hook: fn (): string => $this->shouldRenderClearCacheButton() + ? Blade::render( + '@livewire($component)', + ['component' => $component] + ) + : '', ); } @@ -71,4 +89,29 @@ private static function isLivewireV3(): bool return version_compare($version, '4.0.0', '<'); } + + private function shouldRenderClearCacheButton(): bool + { + if (! Filament::auth()->check()) { + return false; + } + + if (! $this->isHiddenOnSimplePages()) { + return true; + } + + $routeAction = request()->route()?->getActionName(); + + if (! is_string($routeAction) || $routeAction === 'Closure') { + return true; + } + + $routeClass = str($routeAction)->before('@')->toString(); + + if (! class_exists($routeClass)) { + return true; + } + + return ! is_subclass_of($routeClass, SimplePage::class); + } } diff --git a/tests/Unit/FilamentClearCachePluginTest.php b/tests/Unit/FilamentClearCachePluginTest.php index 5f90043..608e93c 100644 --- a/tests/Unit/FilamentClearCachePluginTest.php +++ b/tests/Unit/FilamentClearCachePluginTest.php @@ -1,11 +1,17 @@ shouldNotReceive('renderHook'); FilamentClearCachePlugin::make() @@ -15,11 +21,94 @@ expect(true)->toBeTrue(); }); +it('does not render the clear cache button when unauthenticated', function () { + $hook = captureClearCacheRenderHook(); + + Blade::shouldReceive('render')->never(); + + expect($hook())->toBe(''); +}); + +it('does not render the clear cache button on simple pages', function () { + $hook = captureClearCacheRenderHook(); + + $this->actingAs(createClearCacheUser()); + setClearCacheRouteAction(FilamentClearCachePluginTestSimplePage::class); + + Blade::shouldReceive('render')->never(); + + expect($hook())->toBe(''); +}); + +it('can render the clear cache button on simple pages when enabled', function () { + $hook = captureClearCacheRenderHook( + FilamentClearCachePlugin::make()->hiddenOnSimplePages(false), + ); + + $this->actingAs(createClearCacheUser()); + setClearCacheRouteAction(FilamentClearCachePluginTestSimplePage::class); + + Blade::shouldReceive('render') + ->once() + ->with('@livewire($component)', \Mockery::type('array')) + ->andReturn('clear-cache-button'); + + expect($hook())->toBe('clear-cache-button'); +}); + +it('renders the clear cache button on non-simple pages', function () { + $hook = captureClearCacheRenderHook(); + + $this->actingAs(createClearCacheUser()); + setClearCacheRouteAction(Dashboard::class); + + Blade::shouldReceive('render') + ->once() + ->with('@livewire($component)', \Mockery::type('array')) + ->andReturn('clear-cache-button'); + + expect($hook())->toBe('clear-cache-button'); +}); + it('no-ops during boot when disabled', function () { - $panel = Mockery::mock(Panel::class); + $panel = \Mockery::mock(Panel::class); expect(fn () => FilamentClearCachePlugin::make() ->enabled(false) ->boot($panel)) ->not->toThrow(Throwable::class); }); + +function captureClearCacheRenderHook(?FilamentClearCachePlugin $plugin = null): Closure +{ + $hook = null; + $panel = \Mockery::mock(Panel::class); + $panel + ->shouldReceive('renderHook') + ->once() + ->with('panels::user-menu.before', \Mockery::on(function (Closure $renderHook) use (&$hook): bool { + $hook = $renderHook; + + return true; + })) + ->andReturnSelf(); + + ($plugin ?? FilamentClearCachePlugin::make())->register($panel); + + return $hook; +} + +function createClearCacheUser(): User +{ + return User::create([ + 'name' => 'John', + 'email' => 'test@test.com', + ]); +} + +function setClearCacheRouteAction(string $action): void +{ + $route = Route::get('/clear-cache-test-route', $action); + + request()->setRouteResolver(fn () => $route); +} From d13bee8c598697f5d299f3a72f3fc608107d4a96 Mon Sep 17 00:00:00 2001 From: howdu <533658+howdu@users.noreply.github.com> Date: Wed, 13 May 2026 16:51:12 +0000 Subject: [PATCH 2/2] Fix styling --- tests/Unit/FilamentClearCachePluginTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Unit/FilamentClearCachePluginTest.php b/tests/Unit/FilamentClearCachePluginTest.php index 608e93c..e3c1d2d 100644 --- a/tests/Unit/FilamentClearCachePluginTest.php +++ b/tests/Unit/FilamentClearCachePluginTest.php @@ -11,7 +11,7 @@ class FilamentClearCachePluginTestSimplePage extends SimplePage {} it('does not register panel hooks when disabled', function () { - $panel = \Mockery::mock(Panel::class); + $panel = Mockery::mock(Panel::class); $panel->shouldNotReceive('renderHook'); FilamentClearCachePlugin::make() @@ -50,7 +50,7 @@ class FilamentClearCachePluginTestSimplePage extends SimplePage {} Blade::shouldReceive('render') ->once() - ->with('@livewire($component)', \Mockery::type('array')) + ->with('@livewire($component)', Mockery::type('array')) ->andReturn('clear-cache-button'); expect($hook())->toBe('clear-cache-button'); @@ -64,14 +64,14 @@ class FilamentClearCachePluginTestSimplePage extends SimplePage {} Blade::shouldReceive('render') ->once() - ->with('@livewire($component)', \Mockery::type('array')) + ->with('@livewire($component)', Mockery::type('array')) ->andReturn('clear-cache-button'); expect($hook())->toBe('clear-cache-button'); }); it('no-ops during boot when disabled', function () { - $panel = \Mockery::mock(Panel::class); + $panel = Mockery::mock(Panel::class); expect(fn () => FilamentClearCachePlugin::make() ->enabled(false) @@ -82,11 +82,11 @@ class FilamentClearCachePluginTestSimplePage extends SimplePage {} function captureClearCacheRenderHook(?FilamentClearCachePlugin $plugin = null): Closure { $hook = null; - $panel = \Mockery::mock(Panel::class); + $panel = Mockery::mock(Panel::class); $panel ->shouldReceive('renderHook') ->once() - ->with('panels::user-menu.before', \Mockery::on(function (Closure $renderHook) use (&$hook): bool { + ->with('panels::user-menu.before', Mockery::on(function (Closure $renderHook) use (&$hook): bool { $hook = $renderHook; return true;