From 8c202e94671f20c32245a136c68e42f897e03a4c Mon Sep 17 00:00:00 2001 From: ankitcodes4u Date: Sat, 28 Jun 2025 05:08:58 +0545 Subject: [PATCH 1/5] feat: guest panel --- .../components/theme-switcher.blade.php | 25 ++++++++ resources/views/filament/pages/home.blade.php | 3 + src/Filament/Pages/Home.php | 24 ++++++++ src/FrontendServiceProvider.php | 3 +- src/Providers/FrontendPanelProvider.php | 50 ++++++++-------- .../app/Providers/AdminPanelProvider.php | 58 +++++++++++++------ 6 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 resources/views/filament/components/theme-switcher.blade.php create mode 100644 resources/views/filament/pages/home.blade.php create mode 100644 src/Filament/Pages/Home.php diff --git a/resources/views/filament/components/theme-switcher.blade.php b/resources/views/filament/components/theme-switcher.blade.php new file mode 100644 index 0000000..e665e32 --- /dev/null +++ b/resources/views/filament/components/theme-switcher.blade.php @@ -0,0 +1,25 @@ +@php + $panel = filament()->getCurrentPanel(); + $panelID = $panel ? $panel->getId() : 'null'; +@endphp + +
+ + + +
\ No newline at end of file diff --git a/resources/views/filament/pages/home.blade.php b/resources/views/filament/pages/home.blade.php new file mode 100644 index 0000000..431a83b --- /dev/null +++ b/resources/views/filament/pages/home.blade.php @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/Filament/Pages/Home.php b/src/Filament/Pages/Home.php new file mode 100644 index 0000000..0fe22fa --- /dev/null +++ b/src/Filament/Pages/Home.php @@ -0,0 +1,24 @@ +name(static::$name) ->hasConfigFile() - ->hasTranslations(); + ->hasTranslations() + ->hasViews(); } public function register(): self diff --git a/src/Providers/FrontendPanelProvider.php b/src/Providers/FrontendPanelProvider.php index 5c6d649..9fc483a 100644 --- a/src/Providers/FrontendPanelProvider.php +++ b/src/Providers/FrontendPanelProvider.php @@ -3,19 +3,16 @@ namespace Eclipse\Frontend\Providers; use Eclipse\Common\Providers\GlobalSearchProvider; -use Eclipse\Core\Models\Site; use Eclipse\Core\Services\Registry; -use Filament\Http\Middleware\Authenticate; -use Filament\Http\Middleware\AuthenticateSession; +use Eclipse\Frontend\Filament\Pages; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; -use Filament\Pages; use Filament\Panel; use Filament\PanelProvider; use Filament\Support\Colors\Color; use Filament\Support\Enums\Platform; use Filament\Support\Facades\FilamentView; -use Filament\Widgets; +use Filament\View\PanelsRenderHook; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; @@ -27,44 +24,37 @@ class FrontendPanelProvider extends PanelProvider { + private const PANEL_ID = 'frontend'; + public function panel(Panel $panel): Panel { return $panel - ->id('frontend') + ->id(self::PANEL_ID) ->path('') - ->login() - ->passwordReset() - ->emailVerification() ->colors([ 'primary' => Color::Cyan, 'gray' => Color::Slate, ]) + ->authGuard(self::PANEL_ID) ->topNavigation() ->brandName(fn () => Registry::getSite()->name) ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') ->pages([ - Pages\Dashboard::class, + Pages\Home::class, ]) ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') - ->widgets([ - Widgets\AccountWidget::class, - Widgets\FilamentInfoWidget::class, - ]) + ->widgets([]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, - AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) - ->authMiddleware([ - Authenticate::class, - ]) ->globalSearch(GlobalSearchProvider::class) ->globalSearchKeyBindings(['ctrl+k', 'command+k']) ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { @@ -72,18 +62,32 @@ public function panel(Panel $panel): Panel Platform::Mac => '⌘K', default => null, }) - ->tenant(Site::class, slugAttribute: 'domain') - ->tenantDomain('{tenant:domain}') - ->tenantMenu(false) ->plugins([ EnvironmentIndicatorPlugin::make(), - ]); + ]) + ->renderHook( + PanelsRenderHook::TOPBAR_END, + fn () => view('frontend-panel::filament.components.theme-switcher') + ); } public function register(): void { parent::register(); - FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } + + private static function getThemeIsolationScript(string $panelId): string + { + return ""; + } } diff --git a/workbench/app/Providers/AdminPanelProvider.php b/workbench/app/Providers/AdminPanelProvider.php index e9383f6..8c3f06f 100644 --- a/workbench/app/Providers/AdminPanelProvider.php +++ b/workbench/app/Providers/AdminPanelProvider.php @@ -1,59 +1,79 @@ default() - ->id('admin') - ->path('admin') - ->login() + ->id(self::PANEL_ID) + ->path('') + ->colors([ + 'primary' => Color::Cyan, + 'gray' => Color::Slate, + ]) + ->authGuard(self::PANEL_ID) + ->topNavigation() + ->brandName(fn () => Registry::getSite()->name) + ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') + ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') + ->pages([ + Pages\Home::class, + ]) + ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') + ->widgets([]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, - AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) - ->authMiddleware([ - Authenticate::class, - ]) + ->globalSearch(GlobalSearchProvider::class) + ->globalSearchKeyBindings(['ctrl+k', 'command+k']) + ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { + Platform::Windows, Platform::Linux => 'CTRL+K', + Platform::Mac => '⌘K', + default => null, + }) ->plugins([ - FilamentShieldPlugin::make(), + EnvironmentIndicatorPlugin::make(), ]) - ->pages([ - Dashboard::class, - ]); + ->renderHook( + PanelsRenderHook::TOPBAR_END, + fn () => view('frontend-panel::filament.components.theme-switcher') + ); } public function register(): void { parent::register(); - FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } } From 0325e31a2413607d23423b64e15108c48f61c391 Mon Sep 17 00:00:00 2001 From: ankitcodes4u Date: Sat, 28 Jun 2025 05:27:29 +0545 Subject: [PATCH 2/5] fix: removing unused part --- src/Providers/FrontendPanelProvider.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/Providers/FrontendPanelProvider.php b/src/Providers/FrontendPanelProvider.php index 9fc483a..8c3f06f 100644 --- a/src/Providers/FrontendPanelProvider.php +++ b/src/Providers/FrontendPanelProvider.php @@ -76,18 +76,4 @@ public function register(): void parent::register(); FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } - - private static function getThemeIsolationScript(string $panelId): string - { - return ""; - } } From e6f4de58f519108a6e1f0089eedf6b793e91f8ba Mon Sep 17 00:00:00 2001 From: ankitcodes4u Date: Sat, 28 Jun 2025 06:03:12 +0545 Subject: [PATCH 3/5] fix: reverting change in AdminPanelProvider inside workbench --- .../app/Providers/AdminPanelProvider.php | 58 ++++++------------- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/workbench/app/Providers/AdminPanelProvider.php b/workbench/app/Providers/AdminPanelProvider.php index 8c3f06f..e9383f6 100644 --- a/workbench/app/Providers/AdminPanelProvider.php +++ b/workbench/app/Providers/AdminPanelProvider.php @@ -1,79 +1,59 @@ id(self::PANEL_ID) - ->path('') - ->colors([ - 'primary' => Color::Cyan, - 'gray' => Color::Slate, - ]) - ->authGuard(self::PANEL_ID) - ->topNavigation() - ->brandName(fn () => Registry::getSite()->name) - ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') - ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') - ->pages([ - Pages\Home::class, - ]) - ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') - ->widgets([]) + ->default() + ->id('admin') + ->path('admin') + ->login() ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, + AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) - ->globalSearch(GlobalSearchProvider::class) - ->globalSearchKeyBindings(['ctrl+k', 'command+k']) - ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { - Platform::Windows, Platform::Linux => 'CTRL+K', - Platform::Mac => '⌘K', - default => null, - }) + ->authMiddleware([ + Authenticate::class, + ]) ->plugins([ - EnvironmentIndicatorPlugin::make(), + FilamentShieldPlugin::make(), ]) - ->renderHook( - PanelsRenderHook::TOPBAR_END, - fn () => view('frontend-panel::filament.components.theme-switcher') - ); + ->pages([ + Dashboard::class, + ]); } public function register(): void { parent::register(); + FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } } From 7651f4877cebe8f2b8c4c77a6e6c6bd874e12670 Mon Sep 17 00:00:00 2001 From: ankitcodes4u Date: Sat, 28 Jun 2025 06:29:05 +0545 Subject: [PATCH 4/5] feat: can switch between guest & able to login --- src/Providers/FrontendPanelProvider.php | 103 +++++++++++++++++++----- 1 file changed, 84 insertions(+), 19 deletions(-) diff --git a/src/Providers/FrontendPanelProvider.php b/src/Providers/FrontendPanelProvider.php index 8c3f06f..fbc885f 100644 --- a/src/Providers/FrontendPanelProvider.php +++ b/src/Providers/FrontendPanelProvider.php @@ -3,8 +3,12 @@ namespace Eclipse\Frontend\Providers; use Eclipse\Common\Providers\GlobalSearchProvider; +use Eclipse\Core\Models\Site; use Eclipse\Core\Services\Registry; -use Eclipse\Frontend\Filament\Pages; +use Filament\Http\Middleware\Authenticate; +use Filament\Http\Middleware\AuthenticateSession; +use Filament\Pages; +use Eclipse\Frontend\Filament\Pages as CustomPages; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; use Filament\Panel; @@ -12,6 +16,7 @@ use Filament\Support\Colors\Color; use Filament\Support\Enums\Platform; use Filament\Support\Facades\FilamentView; +use Filament\Widgets; use Filament\View\PanelsRenderHook; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; @@ -28,7 +33,7 @@ class FrontendPanelProvider extends PanelProvider public function panel(Panel $panel): Panel { - return $panel + $panel = $panel ->id(self::PANEL_ID) ->path('') ->colors([ @@ -37,27 +42,14 @@ public function panel(Panel $panel): Panel ]) ->authGuard(self::PANEL_ID) ->topNavigation() - ->brandName(fn () => Registry::getSite()->name) + ->brandName(fn() => Registry::getSite()->name) ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') - ->pages([ - Pages\Home::class, - ]) ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') ->widgets([]) - ->middleware([ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - ShareErrorsFromSession::class, - VerifyCsrfToken::class, - SubstituteBindings::class, - DisableBladeIconComponents::class, - DispatchServingFilamentEvent::class, - ]) ->globalSearch(GlobalSearchProvider::class) ->globalSearchKeyBindings(['ctrl+k', 'command+k']) - ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { + ->globalSearchFieldSuffix(fn(): ?string => match (Platform::detect()) { Platform::Windows, Platform::Linux => 'CTRL+K', Platform::Mac => '⌘K', default => null, @@ -67,13 +59,86 @@ public function panel(Panel $panel): Panel ]) ->renderHook( PanelsRenderHook::TOPBAR_END, - fn () => view('frontend-panel::filament.components.theme-switcher') + fn() => view('frontend-panel::filament.components.theme-switcher') ); + + $middleware = [ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + ]; + + match (self::isGuestPanel()) { + true => $middleware, + false => array_merge($middleware, [ + AuthenticateSession::class, + ]) + }; + + match (self::isGuestPanel()) { + true => $panel + ->pages([ + CustomPages\Home::class, + ]) + ->widgets([]) + ->middleware($middleware) + ->renderHook( + PanelsRenderHook::TOPBAR_END, + fn(): string => self::getThemeIsolationScript(self::PANEL_ID) + ), + false => $panel->login() + ->passwordReset() + ->emailVerification() + ->pages([ + Pages\Dashboard::class, + ]) + ->widgets([ + Widgets\AccountWidget::class, + Widgets\FilamentInfoWidget::class, + ]) + ->middleware($middleware) + ->authMiddleware([ + Authenticate::class, + ]) + ->tenant(Site::class, slugAttribute: 'domain') + ->tenantDomain('{tenant:domain}') + ->tenantMenu(false) + ->renderHook( + PanelsRenderHook::TOPBAR_END, + fn() => view('frontend-panel::filament.components.theme-switcher') + ) + }; + + return $panel; } public function register(): void { parent::register(); - FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); + FilamentView::registerRenderHook('panels::body.end', fn(): string => Blade::render("@vite('resources/js/app.js')")); + } + + private static function getThemeIsolationScript(string $panelId): string + { + return ""; + } + + private static function isGuestPanel(): bool + { + return config('eclipse.guest_panel'); } } From cd85328863d207d5a12ecabd8516f6724379cf6a Mon Sep 17 00:00:00 2001 From: ankitcodes4u Date: Tue, 1 Jul 2025 04:20:28 +0545 Subject: [PATCH 5/5] fix: changing env and bug fixes --- config/frontend-panel.php | 12 +++++++++- src/Providers/FrontendPanelProvider.php | 29 ++++++++++--------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/config/frontend-panel.php b/config/frontend-panel.php index 3ac44ad..b5e2ce1 100644 --- a/config/frontend-panel.php +++ b/config/frontend-panel.php @@ -1,5 +1,15 @@ (bool) env('FRONTEND_GUEST_ACCESS', true), ]; diff --git a/src/Providers/FrontendPanelProvider.php b/src/Providers/FrontendPanelProvider.php index fbc885f..3915c12 100644 --- a/src/Providers/FrontendPanelProvider.php +++ b/src/Providers/FrontendPanelProvider.php @@ -5,19 +5,19 @@ use Eclipse\Common\Providers\GlobalSearchProvider; use Eclipse\Core\Models\Site; use Eclipse\Core\Services\Registry; +use Eclipse\Frontend\Filament\Pages as CustomPages; use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\AuthenticateSession; -use Filament\Pages; -use Eclipse\Frontend\Filament\Pages as CustomPages; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; +use Filament\Pages; use Filament\Panel; use Filament\PanelProvider; use Filament\Support\Colors\Color; use Filament\Support\Enums\Platform; use Filament\Support\Facades\FilamentView; -use Filament\Widgets; use Filament\View\PanelsRenderHook; +use Filament\Widgets; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; @@ -42,25 +42,20 @@ public function panel(Panel $panel): Panel ]) ->authGuard(self::PANEL_ID) ->topNavigation() - ->brandName(fn() => Registry::getSite()->name) + ->brandName(fn () => Registry::getSite()->name) ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') - ->widgets([]) ->globalSearch(GlobalSearchProvider::class) ->globalSearchKeyBindings(['ctrl+k', 'command+k']) - ->globalSearchFieldSuffix(fn(): ?string => match (Platform::detect()) { + ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { Platform::Windows, Platform::Linux => 'CTRL+K', Platform::Mac => '⌘K', default => null, }) ->plugins([ EnvironmentIndicatorPlugin::make(), - ]) - ->renderHook( - PanelsRenderHook::TOPBAR_END, - fn() => view('frontend-panel::filament.components.theme-switcher') - ); + ]); $middleware = [ EncryptCookies::class, @@ -73,7 +68,7 @@ public function panel(Panel $panel): Panel DispatchServingFilamentEvent::class, ]; - match (self::isGuestPanel()) { + $middleware = match (self::isGuestPanel()) { true => $middleware, false => array_merge($middleware, [ AuthenticateSession::class, @@ -89,7 +84,7 @@ public function panel(Panel $panel): Panel ->middleware($middleware) ->renderHook( PanelsRenderHook::TOPBAR_END, - fn(): string => self::getThemeIsolationScript(self::PANEL_ID) + fn () => view('frontend-panel::filament.components.theme-switcher') ), false => $panel->login() ->passwordReset() @@ -109,8 +104,8 @@ public function panel(Panel $panel): Panel ->tenantDomain('{tenant:domain}') ->tenantMenu(false) ->renderHook( - PanelsRenderHook::TOPBAR_END, - fn() => view('frontend-panel::filament.components.theme-switcher') + PanelsRenderHook::HEAD_START, + fn (): string => self::getThemeIsolationScript(self::PANEL_ID) ) }; @@ -120,7 +115,7 @@ public function panel(Panel $panel): Panel public function register(): void { parent::register(); - FilamentView::registerRenderHook('panels::body.end', fn(): string => Blade::render("@vite('resources/js/app.js')")); + FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } private static function getThemeIsolationScript(string $panelId): string @@ -139,6 +134,6 @@ private static function getThemeIsolationScript(string $panelId): string private static function isGuestPanel(): bool { - return config('eclipse.guest_panel'); + return config('frontend-panel.guest_access'); } }