components([ Schemas\Components\Section::make('Identificare') ->columns(2) ->schema([ Forms\Components\TextInput::make('name')->required()->maxLength(120), Forms\Components\TextInput::make('email')->email()->required()->unique(ignoreRecord: true)->maxLength(120), Forms\Components\TextInput::make('phone')->tel()->maxLength(40), Forms\Components\Toggle::make('is_active')->label('Activ')->default(true), ]), Schemas\Components\Section::make('Permisiuni') ->columns(1) ->schema([ Forms\Components\Select::make('role') ->options(SuperAdmin::ROLES) ->default('support') ->required() ->helperText('Owner = drepturi totale. Admin = aproape la fel. Sales = doar tenanți + planuri. Finance = facturi. Support = read-only.'), ]), Schemas\Components\Section::make('Parolă') ->columns(1) ->schema([ Forms\Components\TextInput::make('password') ->password() ->revealable() ->dehydrated(fn ($state) => filled($state)) ->dehydrateStateUsing(fn ($state) => Hash::make($state)) ->required(fn (string $operation) => $operation === 'create') ->minLength(8) ->helperText(fn (string $operation) => $operation === 'edit' ? 'Lasă gol ca să o păstrezi.' : 'Min 8 caractere.'), ]), Forms\Components\Textarea::make('notes')->label('Note interne')->rows(2)->columnSpanFull(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('name')->searchable()->sortable()->weight('bold'), Tables\Columns\TextColumn::make('email')->searchable()->copyable(), Tables\Columns\TextColumn::make('role') ->badge() ->formatStateUsing(fn ($s) => array_keys(SuperAdmin::ROLES, SuperAdmin::ROLES[$s] ?? $s)[0] ?? $s) ->color(fn ($s) => match ($s) { 'owner' => 'danger', 'admin' => 'warning', 'finance' => 'success', 'sales' => 'info', default => 'gray', }), Tables\Columns\IconColumn::make('is_active')->boolean()->label('Activ'), Tables\Columns\IconColumn::make('app_authentication_secret') ->label('2FA') ->boolean() ->getStateUsing(fn ($r) => $r->app_authentication_secret !== null) ->trueIcon('heroicon-o-lock-closed') ->falseIcon('heroicon-o-lock-open') ->trueColor('success') ->falseColor('warning'), Tables\Columns\TextColumn::make('last_login_at')->label('Ultim login')->dateTime()->placeholder('—'), Tables\Columns\TextColumn::make('created_at')->date(), ]) ->filters([ Tables\Filters\SelectFilter::make('role')->options(SuperAdmin::ROLES), Tables\Filters\TernaryFilter::make('is_active')->label('Activ'), ]) ->actions([ Actions\Action::make('reset_password') ->label('Reset parolă') ->icon('heroicon-m-key') ->color('warning') ->schema([ Forms\Components\TextInput::make('new_password') ->password()->required()->minLength(8)->revealable(), ]) ->action(function (SuperAdmin $r, array $data) { $r->update(['password' => Hash::make($data['new_password'])]); Notification::make()->title('Parolă resetată.')->success()->send(); }), Actions\Action::make('toggle_2fa') ->label(fn ($r) => $r->app_authentication_secret ? 'Dezactivează 2FA' : 'Forțează re-setare 2FA') ->icon('heroicon-m-lock-open') ->color('danger') ->visible(fn ($r) => $r->app_authentication_secret !== null) ->requiresConfirmation() ->action(function (SuperAdmin $r) { $r->forceFill([ 'app_authentication_secret' => null, 'app_authentication_recovery_codes' => null, 'email_authentication_at' => null, ])->saveQuietly(); Notification::make()->title('2FA dezactivat.')->success()->send(); }), Actions\EditAction::make(), Actions\DeleteAction::make() ->before(function (SuperAdmin $r) { if (auth('central')->id() === $r->id) { Notification::make()->title('Nu te poți șterge pe tine!')->danger()->send(); return false; } }), ]) ->emptyStateHeading('Doar tu ești aici') ->emptyStateDescription('Adaugă echipa ta — colegi de la suport, sales, finance — fiecare cu rolul lui.') ->defaultSort('created_at', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListSuperAdmins::route('/'), 'create' => Pages\CreateSuperAdmin::route('/create'), 'edit' => Pages\EditSuperAdmin::route('/{record}/edit'), ]; } }