diff --git a/app/Filament/Resources/UserResource/Pages/EditProfile.php b/app/Filament/Resources/UserResource/Pages/EditProfile.php new file mode 100644 index 000000000..8480952ba --- /dev/null +++ b/app/Filament/Resources/UserResource/Pages/EditProfile.php @@ -0,0 +1,99 @@ + $this->form( + $this->makeForm() + ->schema([ + Tabs::make()->schema([ + Tab::make('Account') + ->icon('tabler-user') + ->schema([ + TextInput::make('username') + ->disabled() + ->readOnly() + ->maxLength(191) + ->unique(ignoreRecord: true) + ->autofocus(), + + TextInput::make('email') + ->email() + ->required() + ->maxLength(191) + ->unique(ignoreRecord: true), + + TextInput::make('password') + ->password() + ->revealable(filament()->arePasswordsRevealable()) + ->rule(Password::default()) + ->autocomplete('new-password') + ->dehydrated(fn ($state): bool => filled($state)) + ->dehydrateStateUsing(fn ($state): string => Hash::make($state)) + ->live(debounce: 500) + ->same('passwordConfirmation'), + + TextInput::make('passwordConfirmation') + ->password() + ->revealable(filament()->arePasswordsRevealable()) + ->required() + ->visible(fn (Get $get): bool => filled($get('password'))) + ->dehydrated(false), + ]), + + Tab::make('2FA') + ->icon('tabler-shield-lock') + ->schema([ + Placeholder::make('Coming soon!'), + ]), + + Tab::make('API Keys') + ->icon('tabler-key') + ->schema([ + Placeholder::make('Coming soon!'), + ]), + + Tab::make('SSH Keys') + ->icon('tabler-lock-code') + ->schema([ + Placeholder::make('Coming soon!'), + ]), + + Tab::make('Activity') + ->icon('tabler-activity') + ->schema([ + Repeater::make('activity') + ->deletable(false) + ->addable(false) + ->relationship() + + ->schema([ + Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())), + ]) + ]), + ]), + ]) + ->operation('edit') + ->model($this->getUser()) + ->statePath('data') + ->inlineLabel(! static::isSimple()), + ), + ]; + } +} diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php index 8eaeb744d..06fd2d108 100644 --- a/app/Models/ActivityLog.php +++ b/app/Models/ActivityLog.php @@ -144,4 +144,29 @@ class ActivityLog extends Model Event::dispatch(new ActivityLogged($model)); }); } + + public function htmlable() + { + $user = $this->actor; + if (!$user instanceof User) { + $user = new User([ + 'email' => 'system@pelican.dev', + 'username' => 'system', + ]); + } + + $event = __('activity.'.str($this->event)->replace(':', '.')); + + return " +
+ + +
+

$user->username — $this->event

+

$event

+

$this->ip — {$this->timestamp->diffForHumans()}

+
+
+ "; + } } diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 817e84062..b13685be2 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -2,6 +2,7 @@ namespace App\Providers\Filament; +use App\Filament\Resources\UserResource\Pages\EditProfile; use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; @@ -37,11 +38,7 @@ class AdminPanelProvider extends PanelProvider ->brandName('Pelican') ->homeUrl('/') ->favicon('/favicon.ico') - ->userMenuItems([ - 'profile' => MenuItem::make() - ->label('Edit profile') - ->url(fn (Guard $guard) => '/panel/users/' . $guard->id() . '/edit'), - ]) + ->profile(EditProfile::class, false) ->colors([ 'danger' => Color::Red, 'gray' => Color::Zinc,