From cf24a0555bc61b998c888cbbe40d2b614695b603 Mon Sep 17 00:00:00 2001 From: Baspa Date: Mon, 29 Dec 2025 13:20:18 +0100 Subject: [PATCH 1/8] feat: make user email unique --- src/Resources/UserResource/Schemas/UserForm.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Resources/UserResource/Schemas/UserForm.php b/src/Resources/UserResource/Schemas/UserForm.php index abaeb94..ae0f12b 100644 --- a/src/Resources/UserResource/Schemas/UserForm.php +++ b/src/Resources/UserResource/Schemas/UserForm.php @@ -38,6 +38,7 @@ public static function configure(Schema $schema): Schema ->label(__('Email')) ->prefixIcon(fn (): BackedEnum => Heroicon::Envelope, true) ->email() + ->unique() ->required(), Select::make('roles') From 79b9a9e7d00913795a6bd1c52ad60afadeb889b5 Mon Sep 17 00:00:00 2001 From: Manoj Hortulanus Date: Tue, 13 Jan 2026 15:47:02 +0100 Subject: [PATCH 2/8] Add user management --- src/Resources/RoleResource/RoleResource.php | 2 +- src/Resources/UserResource/Pages/CreateUser.php | 15 ++++++++------- src/Resources/UserResource/Pages/ListUsers.php | 15 ++++++--------- src/Resources/UserResource/Pages/ManageRoles.php | 1 + src/Resources/UserResource/UserResource.php | 11 +++++++---- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Resources/RoleResource/RoleResource.php b/src/Resources/RoleResource/RoleResource.php index 57582f6..da95ad4 100644 --- a/src/Resources/RoleResource/RoleResource.php +++ b/src/Resources/RoleResource/RoleResource.php @@ -31,7 +31,7 @@ public static function getSlug(?Panel $panel = null): string public static function getNavigationGroup(): ?string { - return __('User management'); + return __('Manage'); } public static function getNavigationIcon(): string | BackedEnum | Htmlable | null diff --git a/src/Resources/UserResource/Pages/CreateUser.php b/src/Resources/UserResource/Pages/CreateUser.php index 4f9eba1..8717b59 100644 --- a/src/Resources/UserResource/Pages/CreateUser.php +++ b/src/Resources/UserResource/Pages/CreateUser.php @@ -2,10 +2,11 @@ namespace Backstage\Filament\Users\Resources\UserResource\Pages; -use Backstage\Filament\Users\Resources\UserResource\UserResource; -use Backstage\Laravel\Users\Events\Auth\UserCreated; -use Filament\Resources\Pages\CreateRecord; +use Filament\Facades\Filament; use Illuminate\Support\Facades\Event; +use Filament\Resources\Pages\CreateRecord; +use Backstage\Laravel\Users\Events\Auth\UserCreated; +use Backstage\Filament\Users\Resources\UserResource\UserResource; class CreateUser extends CreateRecord { @@ -14,13 +15,13 @@ public static function getResource(): string return config('backstage.users.resources.users', UserResource::class); } - public function beforeCreate(): void + protected function getCreatedNotificationTitle(): ?string { - Event::forget(UserCreated::class); + return __('User created successfully, the user will receive an email with their registeration details.'); } - protected function getCreatedNotificationTitle(): ?string + public function getRedirectUrl(): string { - return __('User created successfully, the user will receive an email with their registeration details.'); + return $this->getResource()::getUrl('index', ['tenant' => Filament::getTenant()?->getRouteKey()]); } } diff --git a/src/Resources/UserResource/Pages/ListUsers.php b/src/Resources/UserResource/Pages/ListUsers.php index a2b33b8..fed4e63 100644 --- a/src/Resources/UserResource/Pages/ListUsers.php +++ b/src/Resources/UserResource/Pages/ListUsers.php @@ -2,11 +2,12 @@ namespace Backstage\Filament\Users\Resources\UserResource\Pages; -use Backstage\Filament\Users\Resources\UserResource\UserResource; use Filament\Actions; +use Filament\Support\Colors\Color; use Filament\Resources\Pages\ListRecords; use Filament\Schemas\Components\Tabs\Tab; -use Filament\Support\Colors\Color; +use Backstage\Filament\Users\Widgets\StatsOverviewWidget; +use Backstage\Filament\Users\Resources\UserResource\UserResource; class ListUsers extends ListRecords { @@ -25,7 +26,7 @@ protected function getHeaderActions(): array protected function getHeaderWidgets(): array { return [ - \Backstage\Filament\Users\Widgets\StatsOverviewWidget::class, + StatsOverviewWidget::class, ]; } @@ -33,14 +34,10 @@ public function getTabs(): array { return [ 'users' => Tab::make(__('Users')) - ->badge(static::getResource()::getEloquentQuery()->verified()->count()) - ->badgeColor(Color::Green) - ->modifyQueryUsing(fn ($query) => $query->verified()), + ->modifyQueryUsing(fn () => static::getResource()::getEloquentQuery()->verified()), 'pending' => Tab::make(__('Pending')) - ->badge(static::getResource()::getEloquentQuery()->unverified()->count()) - ->badgeColor(Color::Red) - ->modifyQueryUsing(fn ($query) => $query->unverified()), + ->modifyQueryUsing(fn () => static::getResource()::getEloquentQuery()->unverified()), ]; } } diff --git a/src/Resources/UserResource/Pages/ManageRoles.php b/src/Resources/UserResource/Pages/ManageRoles.php index d19ae44..03a314c 100644 --- a/src/Resources/UserResource/Pages/ManageRoles.php +++ b/src/Resources/UserResource/Pages/ManageRoles.php @@ -43,6 +43,7 @@ public function table(Table $table): Table AttachAction::make() ->preloadRecordSelect() ->recordTitleAttribute('name') + ->hidden(fn() => !static::getResource()::canEdit($this->getOwnerRecord())) ->multiple(), CreateAction::make(), diff --git a/src/Resources/UserResource/UserResource.php b/src/Resources/UserResource/UserResource.php index 93be5ab..454fd74 100644 --- a/src/Resources/UserResource/UserResource.php +++ b/src/Resources/UserResource/UserResource.php @@ -43,7 +43,7 @@ public static function getSlug(?Panel $panel = null): string public static function canAccess(): bool { - return UsersPlugin::get()->canManageUsersCondition(); + return parent::canAccess() &&UsersPlugin::get()->canManageUsersCondition(); } public static function getModel(): string @@ -58,7 +58,7 @@ public static function getRecordTitleAttribute(): ?string public static function getNavigationGroup(): ?string { - return __('User management'); + return __('Manage'); } public static function getNavigationIcon(): string | BackedEnum | Htmlable | null @@ -95,10 +95,12 @@ public static function table(Table $table): Table ->headerActions([ ImportAction::make('import') ->importer(UserImporter::class) - ->color('primary'), + ->color('primary') + ->visible(fn() => static::canCreate()), ExportAction::make() - ->exporter(UserExporter::class), + ->exporter(UserExporter::class) + ->visible(fn() => static::canCreate()), ]) ->columns([ Tables\Columns\ImageColumn::make('avatar') @@ -129,6 +131,7 @@ public static function table(Table $table): Table ->label('') ->color('gray') ->tooltip(__('Impersonate')) + ->hidden(fn($record) => !static::canEdit($record)) ->hiddenLabel(), ]) ->toolbarActions([ From 834e259eafb59dd259fa4badc0a402da181b709c Mon Sep 17 00:00:00 2001 From: arduinomaster22 <91618246+arduinomaster22@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:47:44 +0000 Subject: [PATCH 3/8] fix: styling --- src/Resources/UserResource/Pages/CreateUser.php | 4 +--- src/Resources/UserResource/Pages/ListUsers.php | 5 ++--- src/Resources/UserResource/Pages/ManageRoles.php | 2 +- src/Resources/UserResource/UserResource.php | 8 ++++---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Resources/UserResource/Pages/CreateUser.php b/src/Resources/UserResource/Pages/CreateUser.php index 8717b59..4ecb5e2 100644 --- a/src/Resources/UserResource/Pages/CreateUser.php +++ b/src/Resources/UserResource/Pages/CreateUser.php @@ -2,11 +2,9 @@ namespace Backstage\Filament\Users\Resources\UserResource\Pages; +use Backstage\Filament\Users\Resources\UserResource\UserResource; use Filament\Facades\Filament; -use Illuminate\Support\Facades\Event; use Filament\Resources\Pages\CreateRecord; -use Backstage\Laravel\Users\Events\Auth\UserCreated; -use Backstage\Filament\Users\Resources\UserResource\UserResource; class CreateUser extends CreateRecord { diff --git a/src/Resources/UserResource/Pages/ListUsers.php b/src/Resources/UserResource/Pages/ListUsers.php index fed4e63..4e8fcd7 100644 --- a/src/Resources/UserResource/Pages/ListUsers.php +++ b/src/Resources/UserResource/Pages/ListUsers.php @@ -2,12 +2,11 @@ namespace Backstage\Filament\Users\Resources\UserResource\Pages; +use Backstage\Filament\Users\Resources\UserResource\UserResource; +use Backstage\Filament\Users\Widgets\StatsOverviewWidget; use Filament\Actions; -use Filament\Support\Colors\Color; use Filament\Resources\Pages\ListRecords; use Filament\Schemas\Components\Tabs\Tab; -use Backstage\Filament\Users\Widgets\StatsOverviewWidget; -use Backstage\Filament\Users\Resources\UserResource\UserResource; class ListUsers extends ListRecords { diff --git a/src/Resources/UserResource/Pages/ManageRoles.php b/src/Resources/UserResource/Pages/ManageRoles.php index 03a314c..0d17a91 100644 --- a/src/Resources/UserResource/Pages/ManageRoles.php +++ b/src/Resources/UserResource/Pages/ManageRoles.php @@ -43,7 +43,7 @@ public function table(Table $table): Table AttachAction::make() ->preloadRecordSelect() ->recordTitleAttribute('name') - ->hidden(fn() => !static::getResource()::canEdit($this->getOwnerRecord())) + ->hidden(fn () => ! static::getResource()::canEdit($this->getOwnerRecord())) ->multiple(), CreateAction::make(), diff --git a/src/Resources/UserResource/UserResource.php b/src/Resources/UserResource/UserResource.php index 454fd74..9fa7103 100644 --- a/src/Resources/UserResource/UserResource.php +++ b/src/Resources/UserResource/UserResource.php @@ -43,7 +43,7 @@ public static function getSlug(?Panel $panel = null): string public static function canAccess(): bool { - return parent::canAccess() &&UsersPlugin::get()->canManageUsersCondition(); + return parent::canAccess() && UsersPlugin::get()->canManageUsersCondition(); } public static function getModel(): string @@ -96,11 +96,11 @@ public static function table(Table $table): Table ImportAction::make('import') ->importer(UserImporter::class) ->color('primary') - ->visible(fn() => static::canCreate()), + ->visible(fn () => static::canCreate()), ExportAction::make() ->exporter(UserExporter::class) - ->visible(fn() => static::canCreate()), + ->visible(fn () => static::canCreate()), ]) ->columns([ Tables\Columns\ImageColumn::make('avatar') @@ -131,7 +131,7 @@ public static function table(Table $table): Table ->label('') ->color('gray') ->tooltip(__('Impersonate')) - ->hidden(fn($record) => !static::canEdit($record)) + ->hidden(fn ($record) => ! static::canEdit($record)) ->hiddenLabel(), ]) ->toolbarActions([ From 342396ba08ec286281498f728c5c54170c3ffb73 Mon Sep 17 00:00:00 2001 From: Manoj Hortulanus Date: Tue, 13 Jan 2026 16:15:41 +0100 Subject: [PATCH 4/8] Add app name to invitation --- src/Notifications/UserInvitationNotification.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Notifications/UserInvitationNotification.php b/src/Notifications/UserInvitationNotification.php index a882bc6..f9e94c2 100644 --- a/src/Notifications/UserInvitationNotification.php +++ b/src/Notifications/UserInvitationNotification.php @@ -41,7 +41,7 @@ public function toMail(User $notifiable): MailMessage $url = GenerateSignedRegistrationUri::run(user: $notifiable); return (new MailMessage) - ->subject(__('Welcome to Our Platform')) + ->subject(__('Welcome to :appName', ['appName' => config('app.name', 'Backstagephp')])) ->greeting(__('Hello :name!', ['name' => $notifiable->getAttribute('name')])) ->line(__('We are excited to have you on board.')) ->action(__('Register'), $url) From 98ad0ecb8d6d6133d11ee6a8e0b251315e5147eb Mon Sep 17 00:00:00 2001 From: Bas van Dinther Date: Thu, 12 Feb 2026 18:53:55 +0100 Subject: [PATCH 5/8] fix: user verification datetime (#71) --- src/Resources/UserResource/Schemas/UserForm.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Resources/UserResource/Schemas/UserForm.php b/src/Resources/UserResource/Schemas/UserForm.php index ae0f12b..4610d75 100644 --- a/src/Resources/UserResource/Schemas/UserForm.php +++ b/src/Resources/UserResource/Schemas/UserForm.php @@ -79,6 +79,9 @@ public static function configure(Schema $schema): Schema DateTimePicker::make('email_verified_at') ->label(__('Email Verified')) ->live() + ->native(false) + ->seconds(false) + ->displayFormat('M j, Y - H:i') ->prefixIcon(fn (DateTimePicker $component): BackedEnum => ! $component->getState() ? Heroicon::XCircle : Heroicon::CheckCircle, true) ->prefixIconColor(fn (DateTimePicker $component): string => ! $component->getState() ? 'danger' : 'success'), ]) From 79f4ce773809f4b8ea812c420451df8ab0bedba1 Mon Sep 17 00:00:00 2001 From: MHortulanus <91618246+arduinomaster22@users.noreply.github.com> Date: Mon, 16 Feb 2026 15:27:44 +0100 Subject: [PATCH 6/8] Disable sub navigation and width toggles --- config/backstage/users.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/backstage/users.php b/config/backstage/users.php index 8a9154a..d13f64a 100644 --- a/config/backstage/users.php +++ b/config/backstage/users.php @@ -17,8 +17,8 @@ ], 'record' => [ - 'can_toggle_sub_navigation' => true, - 'can_toggle_width' => true, + 'can_toggle_sub_navigation' => false, + 'can_toggle_width' => false, 'manage-api-tokens' => false, ], ]; From 540b57c8cccd7e61f883e114097ba69b3c309b47 Mon Sep 17 00:00:00 2001 From: Baspa Date: Fri, 13 Mar 2026 09:49:39 +0100 Subject: [PATCH 7/8] chore: upgrade Laravel Pint to 1.29.0 and apply code style fixes Upgraded Pint from 1.27.1 to 1.29.0 to align local development with CI workflow. Applied new code style rules across 225 files including: - fully_qualified_strict_types - ordered_imports - braces_position - class_definition Co-Authored-By: Claude Opus 4.5 --- src/Concerns/Resources/HasSubNavigationPosition.php | 3 ++- src/Pages/ManageApiTokens.php | 3 ++- src/Resources/UserResource/Pages/ViewUser.php | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Concerns/Resources/HasSubNavigationPosition.php b/src/Concerns/Resources/HasSubNavigationPosition.php index 4d906b6..7bbc8bd 100644 --- a/src/Concerns/Resources/HasSubNavigationPosition.php +++ b/src/Concerns/Resources/HasSubNavigationPosition.php @@ -2,6 +2,7 @@ namespace Backstage\Filament\Users\Concerns\Resources; +use Backstage\Laravel\Users\Eloquent\Models\User; use Filament\Facades\Filament; use Filament\Pages\Enums\SubNavigationPosition; @@ -10,7 +11,7 @@ trait HasSubNavigationPosition public static function getSubNavigationPosition(): SubNavigationPosition { /** - * @var \Backstage\Laravel\Users\Eloquent\Models\User $user + * @var User $user */ $user = Filament::auth()->user(); diff --git a/src/Pages/ManageApiTokens.php b/src/Pages/ManageApiTokens.php index 673dc74..599e67c 100644 --- a/src/Pages/ManageApiTokens.php +++ b/src/Pages/ManageApiTokens.php @@ -3,6 +3,7 @@ namespace Backstage\Filament\Users\Pages; use BackedEnum; +use Backstage\Filament\Users\Models\User; use Filament\Actions\Action; use Filament\Facades\Filament; use Filament\Forms\Components\TextInput; @@ -87,7 +88,7 @@ public function create() $state = $this->content->getState(); /** - * @var \Backstage\Filament\Users\Models\User $user + * @var User $user */ $user = Filament::auth()->user(); diff --git a/src/Resources/UserResource/Pages/ViewUser.php b/src/Resources/UserResource/Pages/ViewUser.php index fc31c66..d278fb4 100644 --- a/src/Resources/UserResource/Pages/ViewUser.php +++ b/src/Resources/UserResource/Pages/ViewUser.php @@ -10,6 +10,8 @@ use Filament\Auth\Notifications\VerifyEmail; use Filament\Facades\Filament; use Filament\Resources\Pages\ViewRecord; +use Illuminate\Contracts\Auth\Authenticatable; +use Illuminate\Contracts\Auth\PasswordBroker; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Blade; @@ -53,13 +55,13 @@ protected function getHeaderActions(): array ->action(function (): void { /** * @var User $user - * @var \Illuminate\Contracts\Auth\Authenticatable $user + * @var Authenticatable $user */ $user = $this->record; /** * Broker * - * @var \Illuminate\Contracts\Auth\PasswordBroker $broker + * @var PasswordBroker $broker */ $broker = app('auth.password.broker'); From 81fc56382bce45309dbab1bf05ea04d2562e8fe4 Mon Sep 17 00:00:00 2001 From: Mark van Eijk Date: Wed, 25 Mar 2026 10:09:59 +0100 Subject: [PATCH 8/8] Remove spatie/laravel-ray dependency from all packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dependency is unused — no ray() calls exist in the codebase. Removes it from require-dev in 9 packages, the conflict section in laravel-mails, the CI workflow removal step, and the laravel-ai configure script. Co-Authored-By: Claude Opus 4.6 (1M context) --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 9e0a6fe..dff3d5a 100644 --- a/composer.json +++ b/composer.json @@ -38,8 +38,7 @@ "pestphp/pest-plugin-laravel": "^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/laravel-ray": "^1.26" + "phpstan/phpstan-phpunit": "^1.0" }, "autoload": { "psr-4": {