Skip to content

Commit 1928f99

Browse files
committed
wip
1 parent 39552d1 commit 1928f99

File tree

15 files changed

+307
-124
lines changed

15 files changed

+307
-124
lines changed

config/backstage/users.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,25 @@
33
// config for Backstage/Users
44

55
use Backstage\Filament\Users\Pages\ManageApiTokens;
6+
use Backstage\Filament\Users\Resources\UserResource\Pages\ManageRoles;
67
use Backstage\Filament\Users\Resources\UserResource\UserResource;
78

89
return [
910
'resources' => [
1011
'users' => UserResource::class,
1112
],
1213

14+
'resource-pages' => [
15+
'users' => [
16+
'roles' => [
17+
'route' => '/{record}/roles',
18+
'routeName' => 'manage-roles',
19+
'page' => ManageRoles::class,
20+
'registerSubNavigation' => true,
21+
],
22+
],
23+
],
24+
1325
'pages' => [
1426
'manage-api-tokens' => ManageApiTokens::class,
1527
],

src/Actions/GenerateSignedRegistrationUri.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
namespace Backstage\Filament\Users\Actions;
44

5-
use Illuminate\Support\Uri;
5+
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage;
66
use Filament\Facades\Filament;
77
use Illuminate\Database\Eloquent\Model;
8+
use Illuminate\Support\Uri;
89
use Lorisleiva\Actions\Concerns\AsAction;
9-
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage;
1010

1111
class GenerateSignedRegistrationUri
1212
{

src/Events/FilamentUserCreated.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ public function __construct(User $user)
2727

2828
/**
2929
* Get the user instance.
30-
*
31-
* @return User
3230
*/
3331
public function getUser(): User
3432
{

src/Listeners/SendFilamentInvitationMail.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
use Backstage\Filament\Users\Events\FilamentUserCreated;
66
use Backstage\Filament\Users\Notifications\UserInvitationNotification;
7-
use Backstage\Laravel\Users\Events\Auth\UserCreated;
8-
use Backstage\Laravel\Users\Notifications\Invitation;
97

108
class SendFilamentInvitationMail
119
{

src/Notifications/UserInvitationNotification.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
namespace Backstage\Filament\Users\Notifications;
44

5-
use Illuminate\Support\Uri;
6-
use Illuminate\Bus\Queueable;
7-
use Filament\Facades\Filament;
8-
use Illuminate\Notifications\Notification;
5+
use Backstage\Filament\Users\Actions\GenerateSignedRegistrationUri;
6+
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage;
97
use Backstage\Laravel\Users\Eloquent\Models\User;
8+
use Illuminate\Bus\Queueable;
109
use Illuminate\Notifications\Messages\MailMessage;
11-
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage;
12-
use Backstage\Filament\Users\Actions\GenerateSignedRegistrationUri;
10+
use Illuminate\Notifications\Notification;
1311

1412
class UserInvitationNotification extends Notification
1513
{
@@ -37,7 +35,7 @@ public function toMail(User $notifiable): MailMessage
3735
{
3836
/**
3937
* Mask the $dedicatedPanel variable as string to get the route name for the RegisterFromInvitationPage.
40-
*
38+
*
4139
* @var string $dedicatedPanel
4240
*/
4341
$url = GenerateSignedRegistrationUri::run(user: $notifiable);

src/Pages/RegisterFromInvitationPage.php

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,30 @@
33
namespace Backstage\Filament\Users\Pages;
44

55
use BackedEnum;
6-
use Filament\Pages\Page;
6+
use Backstage\Filament\Users\Models\User;
7+
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage\RedirectUrlAfterRegistration;
78
use Filament\Actions\Action;
8-
use Filament\Schemas\Schema;
9+
use Filament\Auth\Events\Registered;
910
use Filament\Facades\Filament;
11+
use Filament\Forms\Components\TextInput;
1012
use Filament\Pages\Auth\Register;
11-
use Filament\Support\Enums\Width;
13+
use Filament\Pages\Concerns\CanUseDatabaseTransactions;
14+
use Filament\Pages\Concerns\InteractsWithFormActions;
15+
use Filament\Pages\Page;
16+
use Filament\Panel;
17+
use Filament\Schemas\Components\Component;
18+
use Filament\Schemas\Concerns\InteractsWithSchemas;
19+
use Filament\Schemas\Contracts\HasSchemas;
20+
use Filament\Schemas\Schema;
1221
use Filament\Support\Colors\Color;
13-
use Illuminate\Support\HtmlString;
14-
use Filament\Auth\Events\Registered;
15-
use Filament\Support\Enums\MaxWidth;
16-
use Filament\Support\Icons\Heroicon;
17-
use Illuminate\Support\Facades\Hash;
18-
use Filament\Schemas\Components\Form;
19-
use Filament\Schemas\Components\Grid;
2022
use Filament\Support\Enums\Alignment;
23+
use Filament\Support\Enums\Width;
24+
use Filament\Support\Icons\Heroicon;
25+
use Illuminate\Contracts\Support\Htmlable;
2126
use Illuminate\Database\Eloquent\Model;
22-
use Filament\Forms\Components\TextInput;
23-
use Filament\Pages\Concerns\HasMaxWidth;
24-
use Backstage\Filament\Users\Models\User;
27+
use Illuminate\Support\Facades\Hash;
28+
use Illuminate\Support\HtmlString;
2529
use Illuminate\Validation\Rules\Password;
26-
use Filament\Schemas\Components\Component;
27-
use Filament\Schemas\Contracts\HasSchemas;
28-
use Illuminate\Contracts\Support\Htmlable;
29-
use Filament\Infolists\Components\TextEntry;
30-
use Filament\Schemas\Concerns\InteractsWithSchemas;
31-
use Filament\Pages\Concerns\InteractsWithFormActions;
32-
use Filament\Pages\Concerns\CanUseDatabaseTransactions;
33-
use Backstage\Filament\Users\Pages\RegisterFromInvitationPage\RedirectUrlAfterRegistration;
34-
use Filament\Panel;
3530

3631
class RegisterFromInvitationPage extends Page implements HasSchemas
3732
{
@@ -98,12 +93,12 @@ protected function getLayoutData(): array
9893
];
9994
}
10095

101-
public function getMaxContentWidth(): Width|string|null
96+
public function getMaxContentWidth(): Width | string | null
10297
{
10398
return Width::TwoExtraLarge;
10499
}
105100

106-
public static function getRouteMiddleware(Panel $panel): string|array
101+
public static function getRouteMiddleware(Panel $panel): string | array
107102
{
108103
return ['signed'];
109104
}
@@ -131,8 +126,8 @@ protected function getNameFormComponent(): Component
131126
return TextInput::make('name')
132127
->disabled()
133128
->hintAction($this->getExplanationAction())
134-
->prefixIcon(fn(): BackedEnum => Heroicon::OutlinedUserCircle, fn(): bool => true)
135-
->prefixIconColor(fn(): ?array => static::getDefaultPanelColor())
129+
->prefixIcon(fn (): BackedEnum => Heroicon::OutlinedUserCircle, fn (): bool => true)
130+
->prefixIconColor(fn (): ?array => static::getDefaultPanelColor())
136131
->label(__('filament-panels::auth/pages/register.form.name.label'));
137132
}
138133

@@ -141,8 +136,8 @@ protected function getEmailFormComponent(): Component
141136
return TextInput::make('email')
142137
->disabled()
143138
->hintAction($this->getExplanationAction())
144-
->prefixIcon(fn(): BackedEnum => Heroicon::OutlinedEnvelope, fn(): bool => true)
145-
->prefixIconColor(fn(): ?array => static::getDefaultPanelColor())
139+
->prefixIcon(fn (): BackedEnum => Heroicon::OutlinedEnvelope, fn (): bool => true)
140+
->prefixIconColor(fn (): ?array => static::getDefaultPanelColor())
146141
->label(__('filament-panels::auth/pages/register.form.email.label'));
147142
}
148143

@@ -154,11 +149,11 @@ protected function getPasswordFormComponent(): Component
154149
->revealable(filament()->arePasswordsRevealable())
155150
->required()
156151
->rule(Password::default())
157-
->dehydrateStateUsing(fn($state) => Hash::make($state))
152+
->dehydrateStateUsing(fn ($state) => Hash::make($state))
158153
->same('passwordConfirmation')
159154
->live()
160-
->prefixIcon(fn(TextInput $component): BackedEnum => Heroicon::LockClosed, fn(): bool => true)
161-
->prefixIconColor(fn(): ?array => static::getDefaultPanelColor())
155+
->prefixIcon(fn (TextInput $component): BackedEnum => Heroicon::LockClosed, fn (): bool => true)
156+
->prefixIconColor(fn (): ?array => static::getDefaultPanelColor())
162157
->validationAttribute(__('filament-panels::auth/pages/register.form.password.validation_attribute'));
163158
}
164159

@@ -172,17 +167,17 @@ protected function getPasswordConfirmationFormComponent(): Component
172167
->rule(Password::default())
173168
->same('password')
174169
->live()
175-
->prefixIcon(fn(TextInput $component): BackedEnum => Heroicon::LockClosed, fn(): bool => true)
176-
->prefixIconColor(fn(): ?array => static::getDefaultPanelColor())
170+
->prefixIcon(fn (TextInput $component): BackedEnum => Heroicon::LockClosed, fn (): bool => true)
171+
->prefixIconColor(fn (): ?array => static::getDefaultPanelColor())
177172
->dehydrated(false);
178173
}
179174

180175
protected function getRegisterActionFormComponent(): Action
181176
{
182177
return Action::make('hi')
183178
->label(__('Register'))
184-
->color(fn(): ?array => static::getDefaultPanelColor())
185-
->action(fn() => $this->register());
179+
->color(fn (): ?array => static::getDefaultPanelColor())
180+
->action(fn () => $this->register());
186181
}
187182

188183
protected static function getDefaultPanelColor(): array
@@ -265,15 +260,15 @@ protected function getExplanationAction(): Action
265260
{
266261
return Action::make('explanation')
267262
->label(__('Explanation'))
268-
->icon(fn(): BackedEnum => Heroicon::OutlinedInformationCircle)
263+
->icon(fn (): BackedEnum => Heroicon::OutlinedInformationCircle)
269264
->color('secondary')
270265
->size('sm')
271266
->modal()
272-
->modalWidth(fn(): Width => Width::TwoExtraLarge)
273-
->modalIcon(fn(): BackedEnum => Heroicon::InformationCircle)
267+
->modalWidth(fn (): Width => Width::TwoExtraLarge)
268+
->modalIcon(fn (): BackedEnum => Heroicon::InformationCircle)
274269
->modalHeading(__('Explanation'))
275-
->modalDescription(fn(): ?Htmlable => new HtmlString(__('Information about the registration process.')))
276-
->modalContent(fn(): ?Htmlable => new HtmlString(__(
270+
->modalDescription(fn (): ?Htmlable => new HtmlString(__('Information about the registration process.')))
271+
->modalContent(fn (): ?Htmlable => new HtmlString(__(
277272
'You are registering as :userName with the email :email. This is because you were invited to join our platform. Your account will be created with the following details: <br>' .
278273
'<strong>Name:</strong> :userName <br>' .
279274
'<strong>Email:</strong> :email <br><br>',
@@ -282,9 +277,9 @@ protected function getExplanationAction(): Action
282277
'email' => $this->user->email,
283278
]
284279
)))
285-
->modalContentFooter(fn(): ?Htmlable => new HtmlString(__('This can later be changed in your profile settings.')))
280+
->modalContentFooter(fn (): ?Htmlable => new HtmlString(__('This can later be changed in your profile settings.')))
286281
->modalFooterActionsAlignment(Alignment::Center)
287-
->modalCancelAction(fn(Action $action): Action => $action->label(__('Close')))
288-
->modalSubmitAction(fn(Action $action): Action => $action->hidden());
282+
->modalCancelAction(fn (Action $action): Action => $action->label(__('Close')))
283+
->modalSubmitAction(fn (Action $action): Action => $action->hidden());
289284
}
290285
}

src/Pages/RegisterFromInvitationPage/RedirectUrlAfterRegistration.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
namespace Backstage\Filament\Users\Pages\RegisterFromInvitationPage;
44

5-
use Backstage\Filament\Users\Models\User;
65
use Closure;
7-
use Filament\Support\Concerns\EvaluatesClosures;
86

97
class RedirectUrlAfterRegistration
108
{
@@ -24,7 +22,7 @@ public static function get($user): ?string
2422
return null;
2523
}
2624

27-
protected static function evaluate(Closure $closure, $user): ?string
25+
protected static function evaluate(Closure $closure, $user): ?string
2826
{
2927
return app()->call($closure, [
3028
'user' => $user,

src/Resources/RoleResource/RoleResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Backstage\Filament\Users\Resources\RoleResource\Schemas\RoleForm;
1111
use Backstage\Filament\Users\Resources\RoleResource\Schemas\RoleInfolist;
1212
use Backstage\Filament\Users\Resources\RoleResource\Tables\RolesTable;
13+
use Filament\Panel;
1314
use Filament\Resources\Resource;
1415
use Filament\Schemas\Schema;
1516
use Filament\Support\Icons\Heroicon;
@@ -23,6 +24,11 @@ class RoleResource extends Resource
2324

2425
protected static ?int $navigationSort = 1;
2526

27+
public static function getSlug(?Panel $panel = null): string
28+
{
29+
return 'users-roles';
30+
}
31+
2632
public static function getNavigationGroup(): ?string
2733
{
2834
return __('User management');

src/Resources/UserResource/Pages/CreateUser.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
namespace Backstage\Filament\Users\Resources\UserResource\Pages;
44

5-
use Illuminate\Support\Facades\Event;
6-
use Filament\Resources\Pages\CreateRecord;
7-
use Backstage\Laravel\Users\Events\Auth\UserCreated;
8-
use Backstage\Laravel\Users\Listeners\Auth\SendInvitationMail;
95
use Backstage\Filament\Users\Resources\UserResource\UserResource;
6+
use Backstage\Laravel\Users\Events\Auth\UserCreated;
7+
use Filament\Resources\Pages\CreateRecord;
8+
use Illuminate\Support\Facades\Event;
109

1110
class CreateUser extends CreateRecord
1211
{

src/Resources/UserResource/Pages/ManageRoles.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Filament\Support\Icons\Heroicon;
1313
use Filament\Tables\Table;
1414
use Illuminate\Contracts\Support\Htmlable;
15+
use Illuminate\Support\Facades\Blade;
16+
use Illuminate\Support\HtmlString;
1517

1618
class ManageRoles extends ManageRelatedRecords
1719
{
@@ -36,6 +38,7 @@ public static function getActiveNavigationIcon(): string | BackedEnum | Htmlable
3638
public function table(Table $table): Table
3739
{
3840
return $table
41+
->heading(fn(): Htmlable => new HtmlString(__('Roles of :name', ['name' => Blade::render('<x-filament::badge>' . $this->getRecordTitle() . '</x-filament::badge>')])))
3942
->headerActions([
4043
AttachAction::make()
4144
->preloadRecordSelect()
@@ -44,7 +47,7 @@ public function table(Table $table): Table
4447

4548
CreateAction::make(),
4649
])
47-
->pushActions([
50+
->pushRecordActions([
4851
DetachAction::make(),
4952
]);
5053
}

0 commit comments

Comments
 (0)