diff --git a/app/Filament/Resources/UserResource/Pages/EditProfile.php b/app/Filament/Resources/UserResource/Pages/EditProfile.php index 836326fb9..a7007f2d5 100644 --- a/app/Filament/Resources/UserResource/Pages/EditProfile.php +++ b/app/Filament/Resources/UserResource/Pages/EditProfile.php @@ -37,95 +37,95 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile ->schema([ Tabs::make()->persistTabInQueryString() ->schema([ - Tab::make('Account') - ->icon('tabler-user') - ->schema([ - TextInput::make('username') - ->disabled() - ->readOnly() - ->maxLength(191) - ->unique(ignoreRecord: true) - ->autofocus(), + Tab::make('Account') + ->icon('tabler-user') + ->schema([ + TextInput::make('username') + ->disabled() + ->readOnly() + ->maxLength(191) + ->unique(ignoreRecord: true) + ->autofocus(), - TextInput::make('email') - ->prefixIcon('tabler-mail') - ->email() - ->required() - ->maxLength(191) - ->unique(ignoreRecord: true), + TextInput::make('email') + ->prefixIcon('tabler-mail') + ->email() + ->required() + ->maxLength(191) + ->unique(ignoreRecord: true), - TextInput::make('password') - ->password() - ->prefixIcon('tabler-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('password') + ->password() + ->prefixIcon('tabler-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() - ->prefixIcon('tabler-password-fingerprint') - ->revealable(filament()->arePasswordsRevealable()) - ->required() - ->visible(fn (Get $get): bool => filled($get('password'))) - ->dehydrated(false), + TextInput::make('passwordConfirmation') + ->password() + ->prefixIcon('tabler-password-fingerprint') + ->revealable(filament()->arePasswordsRevealable()) + ->required() + ->visible(fn (Get $get): bool => filled($get('password'))) + ->dehydrated(false), - Select::make('language') - ->required() - ->prefixIcon('tabler-flag') - ->live() - ->default('en') - ->helperText(fn (User $user, $state) => new HtmlString($user->isLanguageTranslated($state) ? '' : " + Select::make('language') + ->required() + ->prefixIcon('tabler-flag') + ->live() + ->default('en') + ->helperText(fn (User $user, $state) => new HtmlString($user->isLanguageTranslated($state) ? '' : " Your language ($state) has not been translated yet! But never fear, you can help fix that by contributing directly here. ") - ) - ->options(fn (User $user) => $user->getAvailableLanguages()), - ]), + ) + ->options(fn (User $user) => $user->getAvailableLanguages()), + ]), - Tab::make('2FA') - ->icon('tabler-shield-lock') - ->schema(function () { + Tab::make('2FA') + ->icon('tabler-shield-lock') + ->schema(function () { - if ($this->getUser()->use_totp) { - return [ - Placeholder::make('2FA already enabled!'), - ]; - } - $setupService = app(TwoFactorSetupService::class); + if ($this->getUser()->use_totp) { + return [ + Placeholder::make('2FA already enabled!'), + ]; + } + $setupService = app(TwoFactorSetupService::class); - ['image_url_data' => $url] = $setupService->handle($this->getUser()); + ['image_url_data' => $url] = $setupService->handle($this->getUser()); - $options = new QROptions([ - 'svgLogo' => public_path('pelican.svg'), - 'addLogoSpace' => true, - 'logoSpaceWidth' => 13, - 'logoSpaceHeight' => 13, - ]); + $options = new QROptions([ + 'svgLogo' => public_path('pelican.svg'), + 'addLogoSpace' => true, + 'logoSpaceWidth' => 13, + 'logoSpaceHeight' => 13, + ]); - // https://github.com/chillerlan/php-qrcode/blob/main/examples/svgWithLogo.php + // https://github.com/chillerlan/php-qrcode/blob/main/examples/svgWithLogo.php - // SVG logo options (see extended class) - $options->svgLogo = public_path('pelican.svg'); // logo from: https://github.com/simple-icons/simple-icons - $options->svgLogoScale = 0.05; - // $options->svgLogoCssClass = 'dark'; + // SVG logo options (see extended class) + $options->svgLogo = public_path('pelican.svg'); // logo from: https://github.com/simple-icons/simple-icons + $options->svgLogoScale = 0.05; + // $options->svgLogoCssClass = 'dark'; - // QROptions - $options->version = Version::AUTO; - // $options->outputInterface = QRSvgWithLogo::class; - $options->outputBase64 = false; - $options->eccLevel = EccLevel::H; // ECC level H is necessary when using logos - $options->addQuietzone = true; - // $options->drawLightModules = true; - $options->connectPaths = true; - $options->drawCircularModules = true; - // $options->circleRadius = 0.45; + // QROptions + $options->version = Version::AUTO; + // $options->outputInterface = QRSvgWithLogo::class; + $options->outputBase64 = false; + $options->eccLevel = EccLevel::H; // ECC level H is necessary when using logos + $options->addQuietzone = true; + // $options->drawLightModules = true; + $options->connectPaths = true; + $options->drawCircularModules = true; + // $options->circleRadius = 0.45; - $options->svgDefs = ' + $options->svgDefs = ' @@ -135,92 +135,92 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile .light{fill: #000;} ]]>'; - $image = (new QRCode($options))->render($url); + $image = (new QRCode($options))->render($url); - return [ - Placeholder::make('qr') - ->label('Scan QR Code') - ->content(fn () => new HtmlString(" + return [ + Placeholder::make('qr') + ->label('Scan QR Code') + ->content(fn () => new HtmlString("
$image
")) - ->default('asdfasdf'), - ]; - }), + ->default('asdfasdf'), + ]; + }), - Tab::make('API Keys') - ->icon('tabler-key') - ->schema([ - Grid::make('asdf')->columns(5)->schema([ - Section::make('Create API Key')->columnSpan(3)->schema([ - TextInput::make('description'), - TagsInput::make('allowed_ips') - ->splitKeys([',', ' ', 'Tab']) - ->placeholder('Example: 127.0.0.1 or 192.168.1.1') - ->label('Whitelisted IP\'s') - ->helperText('Press enter to add a new IP address or leave blank to allow any IP address') - ->columnSpanFull(), - ])->headerActions([ - Action::make('Create') - ->successRedirectUrl('/panel/profile?tab=-api-keys-tab') - ->action(function (Get $get, Action $action) { - $token = auth()->user()->createToken( - $get('description'), - $get('allowed_ips'), - ); + Tab::make('API Keys') + ->icon('tabler-key') + ->schema([ + Grid::make('asdf')->columns(5)->schema([ + Section::make('Create API Key')->columnSpan(3)->schema([ + TextInput::make('description'), + TagsInput::make('allowed_ips') + ->splitKeys([',', ' ', 'Tab']) + ->placeholder('Example: 127.0.0.1 or 192.168.1.1') + ->label('Whitelisted IP\'s') + ->helperText('Press enter to add a new IP address or leave blank to allow any IP address') + ->columnSpanFull(), + ])->headerActions([ + Action::make('Create') + ->successRedirectUrl('/panel/profile?tab=-api-keys-tab') + ->action(function (Get $get, Action $action) { + $token = auth()->user()->createToken( + $get('description'), + $get('allowed_ips'), + ); - Activity::event('user:api-key.create') - ->subject($token->accessToken) - ->property('identifier', $token->accessToken->identifier) - ->log(); + Activity::event('user:api-key.create') + ->subject($token->accessToken) + ->property('identifier', $token->accessToken->identifier) + ->log(); - $action->success(); - }) - ]), - Section::make('API Keys')->columnSpan(2)->schema([ - Repeater::make('keys') - ->relationship('apiKeys') - ->addable(false) - ->itemLabel(fn ($state) => $state['identifier']) - ->deleteAction(function (Action $action) { - $action->requiresConfirmation()->action(function (array $arguments, Repeater $component) { - $items = $component->getState(); - $key = $items[$arguments['item']]; - ApiKey::find($key['id'] ?? null)?->delete(); + $action->success(); + }), + ]), + Section::make('API Keys')->columnSpan(2)->schema([ + Repeater::make('keys') + ->relationship('apiKeys') + ->addable(false) + ->itemLabel(fn ($state) => $state['identifier']) + ->deleteAction(function (Action $action) { + $action->requiresConfirmation()->action(function (array $arguments, Repeater $component) { + $items = $component->getState(); + $key = $items[$arguments['item']]; + ApiKey::find($key['id'] ?? null)?->delete(); - unset($items[$arguments['item']]); + unset($items[$arguments['item']]); - $component->state($items); + $component->state($items); - $component->callAfterStateUpdated(); - }); - }) - ->schema(fn () => [ - Placeholder::make('adf')->label(fn (ApiKey $key) => $key->memo), - ]), + $component->callAfterStateUpdated(); + }); + }) + ->schema(fn () => [ + Placeholder::make('adf')->label(fn (ApiKey $key) => $key->memo), + ]), + ]), ]), ]), - ]), - Tab::make('SSH Keys') - ->icon('tabler-lock-code') - ->schema([ - Placeholder::make('Coming soon!'), - ]), + Tab::make('SSH Keys') + ->icon('tabler-lock-code') + ->schema([ + Placeholder::make('Coming soon!'), + ]), - Tab::make('Activity') - ->icon('tabler-history') - ->schema([ - Repeater::make('activity') - ->deletable(false) - ->addable(false) - ->relationship(null, function (Builder $query) { - $query->orderBy('timestamp', 'desc'); - }) - ->schema([ - Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())), - ]), - ]), - ]), + Tab::make('Activity') + ->icon('tabler-history') + ->schema([ + Repeater::make('activity') + ->deletable(false) + ->addable(false) + ->relationship(null, function (Builder $query) { + $query->orderBy('timestamp', 'desc'); + }) + ->schema([ + Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())), + ]), + ]), + ]), ]) ->operation('edit') ->model($this->getUser())