Skip to content

Commit 58af860

Browse files
Configure Jetstream classes in providers and separate panels into Admin and App
1 parent f81c11e commit 58af860

File tree

2 files changed

+253
-6
lines changed

2 files changed

+253
-6
lines changed

app/Providers/Filament/AdminPanelProvider.php

Lines changed: 100 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@
22

33
namespace App\Providers\Filament;
44

5+
use App\Filament\Admin\Pages;
6+
use App\Filament\Admin\Pages\EditProfile;
7+
use App\Http\Middleware\TeamsPermission;
8+
use App\Listeners\CreatePersonalTeam;
9+
use App\Listeners\SwitchTeam;
10+
use App\Models\Team;
11+
use Filament\Events\Auth\Registered;
12+
use Filament\Events\TenantSet;
13+
use Filament\Facades\Filament;
514
use Filament\Http\Middleware\Authenticate;
615
use Filament\Http\Middleware\DisableBladeIconComponents;
716
use Filament\Http\Middleware\DispatchServingFilamentEvent;
8-
use Filament\Pages;
17+
use Filament\Navigation\MenuItem;
18+
use Filament\Pages as FilamentPage;
919
use Filament\Panel;
1020
use Filament\PanelProvider;
1121
use Filament\Support\Colors\Color;
@@ -16,24 +26,45 @@
1626
use Illuminate\Routing\Middleware\SubstituteBindings;
1727
use Illuminate\Session\Middleware\AuthenticateSession;
1828
use Illuminate\Session\Middleware\StartSession;
29+
use Illuminate\Support\Facades\Event;
1930
use Illuminate\View\Middleware\ShareErrorsFromSession;
31+
use Laravel\Fortify\Fortify;
32+
use Laravel\Fortify\Http\Controllers\AuthenticatedSessionController;
33+
use Laravel\Fortify\Http\Controllers\RegisteredUserController;
34+
use Laravel\Jetstream\Features;
35+
use Laravel\Jetstream\Jetstream;
2036

2137
class AdminPanelProvider extends PanelProvider
2238
{
2339
public function panel(Panel $panel): Panel
2440
{
25-
return $panel
41+
$panel
42+
->default()
2643
->id('admin')
2744
->path('admin')
45+
->login([AuthenticatedSessionController::class, 'create'])
46+
->registration([RegisteredUserController::class, 'create'])
47+
->passwordReset()
48+
->emailVerification()
49+
->viteTheme('resources/css/Filament/Admin/theme.css')
2850
->colors([
29-
'primary' => Color::Amber,
51+
'primary' => Color::Gray,
52+
])
53+
->userMenuItems([
54+
MenuItem::make()
55+
->label('Profile')
56+
->icon('heroicon-o-user-circle')
57+
->url(fn () => $this->shouldRegisterMenuItem()
58+
? url(EditProfile::getUrl())
59+
: url($panel->getPath())),
3060
])
3161
->discoverResources(in: app_path('Filament/Admin/Resources'), for: 'App\\Filament\\Admin\\Resources')
3262
->discoverPages(in: app_path('Filament/Admin/Pages'), for: 'App\\Filament\\Admin\\Pages')
3363
->pages([
34-
Pages\Dashboard::class,
64+
FilamentPage\Dashboard::class,
65+
Pages\EditProfile::class,
3566
])
36-
->discoverWidgets(in: app_path('Filament/Admin/Widgets'), for: 'App\\Filament\\Admin\\Widgets')
67+
->discoverWidgets(in: app_path('Filament/Admin/Widgets/Home'), for: 'App\\Filament\\Admin\\Widgets\\Home')
3768
->widgets([
3869
Widgets\AccountWidget::class,
3970
Widgets\FilamentInfoWidget::class,
@@ -51,9 +82,72 @@ public function panel(Panel $panel): Panel
5182
])
5283
->authMiddleware([
5384
Authenticate::class,
85+
TeamsPermission::class,
5486
])
5587
->plugins([
5688
\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make()
57-
]);;
89+
]);
90+
91+
if (Features::hasApiFeatures()) {
92+
$panel->userMenuItems([
93+
MenuItem::make()
94+
->label('API Tokens')
95+
->icon('heroicon-o-key')
96+
->url(fn () => $this->shouldRegisterMenuItem()
97+
? url(Pages\ApiTokenManagerPage::getUrl())
98+
: url($panel->getPath())),
99+
]);
100+
}
101+
102+
if (Features::hasTeamFeatures()) {
103+
$panel
104+
->tenant(Team::class, ownershipRelationship: 'team')
105+
->tenantRegistration(Pages\CreateTeam::class)
106+
->tenantProfile(Pages\EditTeam::class)
107+
->userMenuItems([
108+
MenuItem::make()
109+
->label('Team Settings')
110+
->icon('heroicon-o-cog-6-tooth')
111+
->url(fn () => $this->shouldRegisterMenuItem()
112+
? url(Pages\EditTeam::getUrl())
113+
: url($panel->getPath())),
114+
]);
115+
}
116+
117+
return $panel;
118+
}
119+
120+
public function boot()
121+
{
122+
/**
123+
* Disable Fortify routes.
124+
*/
125+
Fortify::$registersRoutes = false;
126+
127+
/**
128+
* Disable Jetstream routes.
129+
*/
130+
Jetstream::$registersRoutes = false;
131+
132+
/**
133+
* Listen and create personal team for new accounts.
134+
*/
135+
Event::listen(
136+
Registered::class,
137+
CreatePersonalTeam::class,
138+
);
139+
140+
/**
141+
* Listen and switch team if tenant was changed.
142+
*/
143+
Event::listen(
144+
TenantSet::class,
145+
SwitchTeam::class,
146+
);
147+
}
148+
149+
public function shouldRegisterMenuItem(): bool
150+
{
151+
return true; //auth()->user()?->hasVerifiedEmail() && Filament::hasTenancy() && Filament::getTenant();
58152
}
59153
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
<?php
2+
3+
namespace App\Providers\Filament;
4+
5+
use App\Filament\App\Pages;
6+
use App\Filament\App\Pages\EditProfile;
7+
use App\Http\Middleware\TeamsPermission;
8+
use App\Listeners\CreatePersonalTeam;
9+
use App\Listeners\SwitchTeam;
10+
use App\Models\Team;
11+
use Filament\Events\Auth\Registered;
12+
use Filament\Events\TenantSet;
13+
use Filament\Facades\Filament;
14+
use Filament\Http\Middleware\Authenticate;
15+
use Filament\Http\Middleware\DisableBladeIconComponents;
16+
use Filament\Http\Middleware\DispatchServingFilamentEvent;
17+
use Filament\Navigation\MenuItem;
18+
use Filament\Pages as FilamentPage;
19+
use Filament\Panel;
20+
use Filament\PanelProvider;
21+
use Filament\Support\Colors\Color;
22+
use Filament\Widgets;
23+
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
24+
use Illuminate\Cookie\Middleware\EncryptCookies;
25+
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
26+
use Illuminate\Routing\Middleware\SubstituteBindings;
27+
use Illuminate\Session\Middleware\AuthenticateSession;
28+
use Illuminate\Session\Middleware\StartSession;
29+
use Illuminate\Support\Facades\Event;
30+
use Illuminate\View\Middleware\ShareErrorsFromSession;
31+
use Laravel\Fortify\Fortify;
32+
use Laravel\Fortify\Http\Controllers\AuthenticatedSessionController;
33+
use Laravel\Fortify\Http\Controllers\RegisteredUserController;
34+
use Laravel\Jetstream\Features;
35+
use Laravel\Jetstream\Jetstream;
36+
37+
class AdminPanelProvider extends PanelProvider
38+
{
39+
public function panel(Panel $panel): Panel
40+
{
41+
$panel
42+
->default()
43+
->id('app')
44+
->path('app')
45+
->login([AuthenticatedSessionController::class, 'create'])
46+
->registration([RegisteredUserController::class, 'create'])
47+
->passwordReset()
48+
->emailVerification()
49+
->viteTheme('resources/css/Filament/App/admin/theme.css')
50+
->colors([
51+
'primary' => Color::Gray,
52+
])
53+
->userMenuItems([
54+
MenuItem::make()
55+
->label('Profile')
56+
->icon('heroicon-o-user-circle')
57+
->url(fn () => $this->shouldRegisterMenuItem()
58+
? url(EditProfile::getUrl())
59+
: url($panel->getPath())),
60+
])
61+
->discoverResources(in: app_path('Filament/App/Resources'), for: 'App\\Filament\\App\\Resources')
62+
->discoverPages(in: app_path('Filament/App/Pages'), for: 'App\\Filament\\App\\Pages')
63+
->pages([
64+
FilamentPage\Dashboard::class,
65+
Pages\EditProfile::class,
66+
])
67+
->discoverWidgets(in: app_path('Filament/App/Widgets/Home'), for: 'App\\Filament\\App\\Widgets\\Home')
68+
->widgets([
69+
Widgets\AccountWidget::class,
70+
Widgets\FilamentInfoWidget::class,
71+
])
72+
->middleware([
73+
EncryptCookies::class,
74+
AddQueuedCookiesToResponse::class,
75+
StartSession::class,
76+
AuthenticateSession::class,
77+
ShareErrorsFromSession::class,
78+
VerifyCsrfToken::class,
79+
SubstituteBindings::class,
80+
DisableBladeIconComponents::class,
81+
DispatchServingFilamentEvent::class,
82+
])
83+
->authMiddleware([
84+
Authenticate::class,
85+
TeamsPermission::class,
86+
])
87+
->plugins([
88+
\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make()
89+
]);
90+
91+
if (Features::hasApiFeatures()) {
92+
$panel->userMenuItems([
93+
MenuItem::make()
94+
->label('API Tokens')
95+
->icon('heroicon-o-key')
96+
->url(fn () => $this->shouldRegisterMenuItem()
97+
? url(Pages\ApiTokenManagerPage::getUrl())
98+
: url($panel->getPath())),
99+
]);
100+
}
101+
102+
if (Features::hasTeamFeatures()) {
103+
$panel
104+
->tenant(Team::class, ownershipRelationship: 'team')
105+
->tenantRegistration(Pages\CreateTeam::class)
106+
->tenantProfile(Pages\EditTeam::class)
107+
->userMenuItems([
108+
MenuItem::make()
109+
->label('Team Settings')
110+
->icon('heroicon-o-cog-6-tooth')
111+
->url(fn () => $this->shouldRegisterMenuItem()
112+
? url(Pages\EditTeam::getUrl())
113+
: url($panel->getPath())),
114+
]);
115+
}
116+
117+
return $panel;
118+
}
119+
120+
public function boot()
121+
{
122+
/**
123+
* Disable Fortify routes.
124+
*/
125+
Fortify::$registersRoutes = false;
126+
127+
/**
128+
* Disable Jetstream routes.
129+
*/
130+
Jetstream::$registersRoutes = false;
131+
132+
/**
133+
* Listen and create personal team for new accounts.
134+
*/
135+
Event::listen(
136+
Registered::class,
137+
CreatePersonalTeam::class,
138+
);
139+
140+
/**
141+
* Listen and switch team if tenant was changed.
142+
*/
143+
Event::listen(
144+
TenantSet::class,
145+
SwitchTeam::class,
146+
);
147+
}
148+
149+
public function shouldRegisterMenuItem(): bool
150+
{
151+
return true; //auth()->user()?->hasVerifiedEmail() && Filament::hasTenancy() && Filament::getTenant();
152+
}
153+
}

0 commit comments

Comments
 (0)