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;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\FinituraResource\Pages;
use App\Filament\Support\CampiConfiguratore;
use App\Models\Finitura;
@@ -14,8 +15,11 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Validation\Rules\Unique;
class FinituraResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = Finitura::class;
protected static ?string $navigationIcon = 'heroicon-o-swatch';
@@ -10,10 +10,14 @@ use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
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". */
class GruppoOpzioniResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = GruppoOpzioni::class;
protected static ?string $navigationIcon = 'heroicon-o-queue-list';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\ModelloResource\Pages;
use App\Filament\Resources\ModelloResource\RelationManagers\FinitureRelationManager;
use App\Filament\Resources\ModelloResource\RelationManagers\ListinoRelationManager;
@@ -16,8 +17,11 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Validation\Rules\Unique;
class ModelloResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = Modello::class;
protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';
@@ -17,10 +17,14 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Illuminate\Validation\Rules\Unique;
use App\Filament\Concerns\SoloSuperadmin;
/** Opzioni e supplementi del sistema (le personalizzazioni per modello sono nella scheda del modello). */
class OpzioneResource extends Resource
{
use SoloSuperadmin;
/** Voce "Altro" del valore nelle opzioni personalizzate: valore scritto a mano. */
public const ALTRO = '__altro';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\RegolaVetroResource\Pages;
use App\Filament\Support\CampiConfiguratore;
use App\Models\RegolaVetro;
@@ -14,8 +15,11 @@ use Filament\Tables\Table;
use Illuminate\Support\HtmlString;
use Illuminate\Validation\Rules\Unique;
class RegolaVetroResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = RegolaVetro::class;
protected static ?string $navigationIcon = 'heroicon-o-calculator';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\SistemaResource\Actions\ImportaListiniAction;
use App\Filament\Resources\SistemaResource\Pages;
use App\Models\Sistema;
@@ -11,8 +12,11 @@ use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
class SistemaResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = Sistema::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
@@ -2,6 +2,7 @@
namespace App\Filament\Resources;
use App\Filament\Concerns\SoloSuperadmin;
use App\Filament\Resources\VetroResource\Pages;
use App\Filament\Support\CampiConfiguratore;
use App\Models\Vetro;
@@ -13,8 +14,11 @@ use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Validation\Rules\Unique;
class VetroResource extends Resource
{
use SoloSuperadmin;
protected static ?string $model = Vetro::class;
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\Notifications\Notifiable;
#[Fillable(['name', 'email', 'password'])]
#[Fillable(['name', 'email', 'password', 'is_superadmin'])]
#[Hidden(['password', 'remember_token'])]
class User extends Authenticatable
{
@@ -27,6 +27,7 @@ class User extends Authenticatable
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'is_superadmin' => 'boolean',
];
}
}
@@ -27,6 +27,7 @@ class AdminPanelProvider extends PanelProvider
->id('admin')
->path('admin')
->login()
->profile(isSimple: false)
->brandName('Krèios')
->brandLogo(asset('images/kreios-logo.jpg'))
->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
{
// Utente amministratore del backoffice.
User::updateOrCreate(
User::firstOrCreate(
['email' => 'admin@kreiosinfissi.it'],
[
'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]);
}
}