Skip to content

Commit ebdefec

Browse files
committed
Hide clear cache button on simple pages
1 parent 42dc2e2 commit ebdefec

2 files changed

Lines changed: 139 additions & 7 deletions

File tree

src/FilamentClearCachePlugin.php

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use CmsMulti\FilamentClearCache\Http\Livewire\ClearCache;
77
use Composer\InstalledVersions;
88
use Filament\Contracts\Plugin;
9+
use Filament\Facades\Filament;
10+
use Filament\Pages\SimplePage;
911
use Filament\Panel;
1012
use Illuminate\Support\Facades\Blade;
1113
use Livewire\Livewire;
@@ -20,11 +22,25 @@ class FilamentClearCachePlugin implements Plugin
2022

2123
const VERSION = '3.0.1';
2224

25+
protected bool $hiddenOnSimplePages = true;
26+
2327
public static function make(): static
2428
{
2529
return app(static::class);
2630
}
2731

32+
public function hiddenOnSimplePages(bool $condition = true): static
33+
{
34+
$this->hiddenOnSimplePages = $condition;
35+
36+
return $this;
37+
}
38+
39+
public function isHiddenOnSimplePages(): bool
40+
{
41+
return $this->hiddenOnSimplePages;
42+
}
43+
2844
public function getId(): string
2945
{
3046
return static::ID;
@@ -44,10 +60,12 @@ public function register(Panel $panel): void
4460

4561
$panel->renderHook(
4662
name: 'panels::user-menu.before',
47-
hook: fn (): string => Blade::render(
48-
'@livewire($component)',
49-
['component' => $component]
50-
),
63+
hook: fn (): string => $this->shouldRenderClearCacheButton()
64+
? Blade::render(
65+
'@livewire($component)',
66+
['component' => $component]
67+
)
68+
: '',
5169
);
5270
}
5371

@@ -71,4 +89,29 @@ private static function isLivewireV3(): bool
7189

7290
return version_compare($version, '4.0.0', '<');
7391
}
92+
93+
private function shouldRenderClearCacheButton(): bool
94+
{
95+
if (! Filament::auth()->check()) {
96+
return false;
97+
}
98+
99+
if (! $this->isHiddenOnSimplePages()) {
100+
return true;
101+
}
102+
103+
$routeAction = request()->route()?->getActionName();
104+
105+
if (! is_string($routeAction) || $routeAction === 'Closure') {
106+
return true;
107+
}
108+
109+
$routeClass = str($routeAction)->before('@')->toString();
110+
111+
if (! class_exists($routeClass)) {
112+
return true;
113+
}
114+
115+
return ! is_subclass_of($routeClass, SimplePage::class);
116+
}
74117
}
Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
<?php
22

33
use CmsMulti\FilamentClearCache\FilamentClearCachePlugin;
4+
use CmsMulti\FilamentClearCache\Tests\Models\User;
5+
use Filament\Pages\Dashboard;
6+
use Filament\Pages\SimplePage;
47
use Filament\Panel;
5-
use Mockery;
8+
use Illuminate\Support\Facades\Blade;
9+
use Illuminate\Support\Facades\Route;
10+
11+
class FilamentClearCachePluginTestSimplePage extends SimplePage {}
612

713
it('does not register panel hooks when disabled', function () {
8-
$panel = Mockery::mock(Panel::class);
14+
$panel = \Mockery::mock(Panel::class);
915
$panel->shouldNotReceive('renderHook');
1016

1117
FilamentClearCachePlugin::make()
@@ -15,11 +21,94 @@
1521
expect(true)->toBeTrue();
1622
});
1723

24+
it('does not render the clear cache button when unauthenticated', function () {
25+
$hook = captureClearCacheRenderHook();
26+
27+
Blade::shouldReceive('render')->never();
28+
29+
expect($hook())->toBe('');
30+
});
31+
32+
it('does not render the clear cache button on simple pages', function () {
33+
$hook = captureClearCacheRenderHook();
34+
35+
$this->actingAs(createClearCacheUser());
36+
setClearCacheRouteAction(FilamentClearCachePluginTestSimplePage::class);
37+
38+
Blade::shouldReceive('render')->never();
39+
40+
expect($hook())->toBe('');
41+
});
42+
43+
it('can render the clear cache button on simple pages when enabled', function () {
44+
$hook = captureClearCacheRenderHook(
45+
FilamentClearCachePlugin::make()->hiddenOnSimplePages(false),
46+
);
47+
48+
$this->actingAs(createClearCacheUser());
49+
setClearCacheRouteAction(FilamentClearCachePluginTestSimplePage::class);
50+
51+
Blade::shouldReceive('render')
52+
->once()
53+
->with('@livewire($component)', \Mockery::type('array'))
54+
->andReturn('clear-cache-button');
55+
56+
expect($hook())->toBe('clear-cache-button');
57+
});
58+
59+
it('renders the clear cache button on non-simple pages', function () {
60+
$hook = captureClearCacheRenderHook();
61+
62+
$this->actingAs(createClearCacheUser());
63+
setClearCacheRouteAction(Dashboard::class);
64+
65+
Blade::shouldReceive('render')
66+
->once()
67+
->with('@livewire($component)', \Mockery::type('array'))
68+
->andReturn('clear-cache-button');
69+
70+
expect($hook())->toBe('clear-cache-button');
71+
});
72+
1873
it('no-ops during boot when disabled', function () {
19-
$panel = Mockery::mock(Panel::class);
74+
$panel = \Mockery::mock(Panel::class);
2075

2176
expect(fn () => FilamentClearCachePlugin::make()
2277
->enabled(false)
2378
->boot($panel))
2479
->not->toThrow(Throwable::class);
2580
});
81+
82+
function captureClearCacheRenderHook(?FilamentClearCachePlugin $plugin = null): Closure
83+
{
84+
$hook = null;
85+
$panel = \Mockery::mock(Panel::class);
86+
$panel
87+
->shouldReceive('renderHook')
88+
->once()
89+
->with('panels::user-menu.before', \Mockery::on(function (Closure $renderHook) use (&$hook): bool {
90+
$hook = $renderHook;
91+
92+
return true;
93+
}))
94+
->andReturnSelf();
95+
96+
($plugin ?? FilamentClearCachePlugin::make())->register($panel);
97+
98+
return $hook;
99+
}
100+
101+
function createClearCacheUser(): User
102+
{
103+
return User::create([
104+
'name' => 'John',
105+
'email' => 'test@test.com',
106+
]);
107+
}
108+
109+
function setClearCacheRouteAction(string $action): void
110+
{
111+
$route = Route::get('/clear-cache-test-route', $action);
112+
113+
request()->setRouteResolver(fn () => $route);
114+
}

0 commit comments

Comments
 (0)