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": { 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, ], ]; 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/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) 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/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..4ecb5e2 100644 --- a/src/Resources/UserResource/Pages/CreateUser.php +++ b/src/Resources/UserResource/Pages/CreateUser.php @@ -3,9 +3,8 @@ namespace Backstage\Filament\Users\Resources\UserResource\Pages; use Backstage\Filament\Users\Resources\UserResource\UserResource; -use Backstage\Laravel\Users\Events\Auth\UserCreated; +use Filament\Facades\Filament; use Filament\Resources\Pages\CreateRecord; -use Illuminate\Support\Facades\Event; class CreateUser extends CreateRecord { @@ -14,13 +13,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..4e8fcd7 100644 --- a/src/Resources/UserResource/Pages/ListUsers.php +++ b/src/Resources/UserResource/Pages/ListUsers.php @@ -3,10 +3,10 @@ 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\Resources\Pages\ListRecords; use Filament\Schemas\Components\Tabs\Tab; -use Filament\Support\Colors\Color; class ListUsers extends ListRecords { @@ -25,7 +25,7 @@ protected function getHeaderActions(): array protected function getHeaderWidgets(): array { return [ - \Backstage\Filament\Users\Widgets\StatsOverviewWidget::class, + StatsOverviewWidget::class, ]; } @@ -33,14 +33,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..0d17a91 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/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'); diff --git a/src/Resources/UserResource/Schemas/UserForm.php b/src/Resources/UserResource/Schemas/UserForm.php index abaeb94..4610d75 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') @@ -78,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'), ]) diff --git a/src/Resources/UserResource/UserResource.php b/src/Resources/UserResource/UserResource.php index 93be5ab..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 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([