diff --git a/.env.example b/.env.example index 2d28a28..079ecb0 100644 --- a/.env.example +++ b/.env.example @@ -68,3 +68,7 @@ ACTIVITY_LOGGER_ENABLED=true ACTIVITY_LOGGER_TABLE_NAME=activity_log FILAMENT_LOG_VIEWER_DRIVER=raw +FILAMENT_ROUTE=dash +FILAMENT_ENABLE_LOGIN=true +FILAMENT_ENABLE_REGISTER=false +FILAMENT_ENABLE_PROFILE=false diff --git a/app/Models/User.php b/app/Models/User.php index 558cbed..ad0e3e7 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,6 +2,8 @@ namespace App\Models; +use Filament\Models\Contracts\FilamentUser; +use Filament\Panel; use Illuminate\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; @@ -10,7 +12,7 @@ use Illuminate\Support\Str; use Laravel\Fortify\TwoFactorAuthenticatable; use Spatie\Permission\Traits\HasRoles; -class User extends Authenticatable +class User extends Authenticatable implements FilamentUser { /** @use HasFactory<\Database\Factories\UserFactory> */ use HasFactory, Notifiable, TwoFactorAuthenticatable, MustVerifyEmail, HasRoles; @@ -61,4 +63,9 @@ class User extends Authenticatable ->map(fn ($word) => Str::substr($word, 0, 1)) ->implode(''); } + + public function canAccessPanel(Panel $panel): bool + { + return $this->hasPermissionTo('manage panels'); + } } diff --git a/app/Providers/Filament/DashPanelProvider.php b/app/Providers/Filament/DashPanelProvider.php index b2d06d2..a6a070e 100644 --- a/app/Providers/Filament/DashPanelProvider.php +++ b/app/Providers/Filament/DashPanelProvider.php @@ -28,14 +28,11 @@ class DashPanelProvider extends PanelProvider { public function panel(Panel $panel): Panel { - return $panel + $panel = $panel ->default() ->id('dash') - ->path('dash') - ->login() - ->colors([ - 'primary' => Color::Amber, - ]) + ->path(config('filament-php.route')) + ->colors(config('filament-php.colors')) ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources') ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages') ->pages([ @@ -81,5 +78,19 @@ class DashPanelProvider extends PanelProvider }), ]) ->routes(fn () => FilamentMails::routes()); + + if (config('filament-php.enable_login')) { + $panel->login(); + } + + if (config('filament-php.enable_registration')) { + $panel->register(); + } + + if (config('filament-php.enable_profile')) { + $panel->profile(); + } + + return $panel; } } diff --git a/config/filament-php.php b/config/filament-php.php new file mode 100644 index 0000000..1c59e2d --- /dev/null +++ b/config/filament-php.php @@ -0,0 +1,18 @@ + env('FILAMENT_ROUTE', 'dash'), + 'colors' => [ + 'primary' => Color::Teal, + 'danger' => Color::Red, + 'gray' => Color::Zinc, + 'info' => Color::Blue, + 'success' => Color::Green, + 'warning' => Color::Amber, + ], + 'enable_login' => env('FILAMENT_ENABLE_LOGIN', true), + 'enable_registration' => env('FILAMENT_ENABLE_REGISTER', false), + 'enable_profile' => env('FILAMENT_ENABLE_PROFILE', false), +]; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 8c7cd7c..c6fd55d 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -17,7 +17,7 @@ class DatabaseSeeder extends Seeder $this->call([ RoleSeeder::class, - FilamentAdminSeeder::class, + FilamentAdminSeeder::class, ]); } } diff --git a/resources/css/app.css b/resources/css/app.css index ad6eeed..4049939 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -26,6 +26,31 @@ --color-accent: var(--color-neutral-800); --color-accent-content: var(--color-neutral-800); --color-accent-foreground: var(--color-white); + + --color-primary-50: #f0f3fd; + --color-primary-100: #e5eafa; + --color-primary-200: #cfd8f6; + --color-primary-300: #b2beef; + --color-primary-400: #929ce7; + --color-primary-500: #787ddc; + --color-primary-600: #615dce; + --color-primary-700: #5853b7; + --color-primary-800: #444192; + --color-primary-900: #3b3a75; + --color-primary-950: #232244; + + --color-app-primary-50: oklch(0.958 0.012 291.4); + --color-app-primary-100: oklch(0.915 0.027 292.8); + --color-app-primary-200: oklch(0.839 0.051 291.47); + --color-app-primary-300: oklch(0.755 0.081 290.76); + --color-app-primary-400: oklch(0.674 0.11 290.49); + --color-app-primary-500: oklch(0.589 0.137 290.02); + --color-app-primary-600: oklch(0.506 0.16 288.92); + --color-app-primary-700: oklch(0.418 0.144 288.02); + --color-app-primary-800: oklch(0.321 0.111 288.33); + --color-app-primary-900: oklch(0.232 0.08 287.92); + --color-app-primary-950: oklch(0.183 0.064 288.2); + } @layer theme {