feat: aggiungi supporto per superadmin in diverse risorse e aggiorna il modello utente

This commit is contained in:
2026-10-23 10:13:54 +02:00
parent f8ef927120
commit 139b1690ff
12 changed files with 109 additions and 2 deletions
@@ -0,0 +1,27 @@
<?php
namespace App\Filament\Concerns;
use Illuminate\Database\Eloquent\Model;
/**
* Rende la risorsa visibile e accessibile solo al superadmin
* (menù, pagine e azioni: lista, crea, modifica, elimina).
*/
trait SoloSuperadmin
{
protected static function isSuperadmin(): bool
{
return (bool) auth()->user()?->is_superadmin;
}
public static function canAccess(): bool
{
return static::isSuperadmin() && parent::canAccess();
}
public static function can(string $action, ?Model $record = null): bool
{
return static::isSuperadmin() && parent::can($action, $record);
}
}
@@ -2,6 +2,7 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\FinituraResource\Pages; use App\Filament\Resources\FinituraResource\Pages;
use App\Filament\Support\CampiConfiguratore; use App\Filament\Support\CampiConfiguratore;
use App\Models\Finitura; use App\Models\Finitura;
@@ -14,8 +15,11 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
class FinituraResource extends Resource class FinituraResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = Finitura::class; protected static ?string $model = Finitura::class;
protected static ?string $navigationIcon = 'heroicon-o-swatch'; protected static ?string $navigationIcon = 'heroicon-o-swatch';
@@ -10,10 +10,14 @@ use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
use Filament\Tables\Table; use Filament\Tables\Table;
use App\Filament\Concerns\SoloSuperadmin;
/** Gruppi di opzioni del configuratore: un nuovo gruppo si crea qui, le sue voci in "Opzioni e supplementi". */ /** Gruppi di opzioni del configuratore: un nuovo gruppo si crea qui, le sue voci in "Opzioni e supplementi". */
class GruppoOpzioniResource extends Resource class GruppoOpzioniResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = GruppoOpzioni::class; protected static ?string $model = GruppoOpzioni::class;
protected static ?string $navigationIcon = 'heroicon-o-queue-list'; protected static ?string $navigationIcon = 'heroicon-o-queue-list';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\ModelloResource\Pages; use App\Filament\Resources\ModelloResource\Pages;
use App\Filament\Resources\ModelloResource\RelationManagers\FinitureRelationManager; use App\Filament\Resources\ModelloResource\RelationManagers\FinitureRelationManager;
use App\Filament\Resources\ModelloResource\RelationManagers\ListinoRelationManager; use App\Filament\Resources\ModelloResource\RelationManagers\ListinoRelationManager;
@@ -16,8 +17,11 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
class ModelloResource extends Resource class ModelloResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = Modello::class; protected static ?string $model = Modello::class;
protected static ?string $navigationIcon = 'heroicon-o-squares-2x2'; protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';
@@ -17,10 +17,14 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
use App\Filament\Concerns\SoloSuperadmin;
/** Opzioni e supplementi del sistema (le personalizzazioni per modello sono nella scheda del modello). */ /** Opzioni e supplementi del sistema (le personalizzazioni per modello sono nella scheda del modello). */
class OpzioneResource extends Resource class OpzioneResource extends Resource
{ {
use SoloSuperadmin;
/** Voce "Altro" del valore nelle opzioni personalizzate: valore scritto a mano. */ /** Voce "Altro" del valore nelle opzioni personalizzate: valore scritto a mano. */
public const ALTRO = '__altro'; public const ALTRO = '__altro';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\RegolaVetroResource\Pages; use App\Filament\Resources\RegolaVetroResource\Pages;
use App\Filament\Support\CampiConfiguratore; use App\Filament\Support\CampiConfiguratore;
use App\Models\RegolaVetro; use App\Models\RegolaVetro;
@@ -14,8 +15,11 @@ use Filament\Tables\Table;
use Illuminate\Support\HtmlString; use Illuminate\Support\HtmlString;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
class RegolaVetroResource extends Resource class RegolaVetroResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = RegolaVetro::class; protected static ?string $model = RegolaVetro::class;
protected static ?string $navigationIcon = 'heroicon-o-calculator'; protected static ?string $navigationIcon = 'heroicon-o-calculator';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\SistemaResource\Actions\ImportaListiniAction; use App\Filament\Resources\SistemaResource\Actions\ImportaListiniAction;
use App\Filament\Resources\SistemaResource\Pages; use App\Filament\Resources\SistemaResource\Pages;
use App\Models\Sistema; use App\Models\Sistema;
@@ -11,8 +12,11 @@ use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
use Filament\Tables\Table; use Filament\Tables\Table;
class SistemaResource extends Resource class SistemaResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = Sistema::class; protected static ?string $model = Sistema::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\VetroResource\Pages; use App\Filament\Resources\VetroResource\Pages;
use App\Filament\Support\CampiConfiguratore; use App\Filament\Support\CampiConfiguratore;
use App\Models\Vetro; use App\Models\Vetro;
@@ -13,8 +14,11 @@ use Filament\Tables;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
class VetroResource extends Resource class VetroResource extends Resource
{ {
use SoloSuperadmin;
protected static ?string $model = Vetro::class; protected static ?string $model = Vetro::class;
protected static ?string $navigationIcon = 'heroicon-o-square-2-stack'; protected static ?string $navigationIcon = 'heroicon-o-square-2-stack';
+2 -1
View File
@@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
#[Fillable(['name', 'email', 'password'])] #[Fillable(['name', 'email', 'password', 'is_superadmin'])]
#[Hidden(['password', 'remember_token'])] #[Hidden(['password', 'remember_token'])]
class User extends Authenticatable class User extends Authenticatable
{ {
@@ -27,6 +27,7 @@ class User extends Authenticatable
return [ return [
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
'password' => 'hashed', 'password' => 'hashed',
'is_superadmin' => 'boolean',
]; ];
} }
} }
@@ -27,6 +27,7 @@ class AdminPanelProvider extends PanelProvider
->id('admin') ->id('admin')
->path('admin') ->path('admin')
->login() ->login()
->profile(isSimple: false)
->brandName('Krèios') ->brandName('Krèios')
->brandLogo(asset('images/kreios-logo.jpg')) ->brandLogo(asset('images/kreios-logo.jpg'))
->brandLogoHeight('2.5rem') ->brandLogoHeight('2.5rem')
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_superadmin')->default(false)->after('password');
});
// Superadmin iniziale: password provvisoria, da cambiare dal profilo.
if (! DB::table('users')->where('email', 'admin@aurealab.net')->exists()) {
DB::table('users')->insert([
'name' => 'Superadmin',
'email' => 'admin@aurealab.net',
'password' => Hash::make('Aurealab-Kreios-2026!'),
'is_superadmin' => true,
'created_at' => now(),
'updated_at' => now(),
]);
} else {
DB::table('users')->where('email', 'admin@aurealab.net')->update(['is_superadmin' => true]);
}
}
public function down(): void
{
DB::table('users')->where('email', 'admin@aurealab.net')->delete();
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('is_superadmin');
});
}
};
+11 -1
View File
@@ -14,7 +14,7 @@ class DatabaseSeeder extends Seeder
public function run(): void public function run(): void
{ {
// Utente amministratore del backoffice. // Utente amministratore del backoffice.
User::updateOrCreate( User::firstOrCreate(
['email' => 'admin@kreiosinfissi.it'], ['email' => 'admin@kreiosinfissi.it'],
[ [
'name' => 'Amministratore', 'name' => 'Amministratore',
@@ -22,6 +22,16 @@ class DatabaseSeeder extends Seeder
] ]
); );
// Superadmin: vede anche le sezioni Prodotti e Configuratore.
User::firstOrCreate(
['email' => 'admin@aurealab.net'],
[
'name' => 'Superadmin',
'password' => Hash::make('Aurealab-Kreios-2026!'),
'is_superadmin' => true,
]
);
$this->call([CatalogoSeeder::class, ConfiguratoreSeeder::class, ProfiliExtraSeeder::class, NuoveOpzioniSeeder::class]); $this->call([CatalogoSeeder::class, ConfiguratoreSeeder::class, ProfiliExtraSeeder::class, NuoveOpzioniSeeder::class]);
} }
} }