From 3350dde12f169cf82f7fb6b0e1f9c7730b6fa844 Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Mon, 30 Dec 2024 19:45:10 -0500 Subject: [PATCH 1/2] [Feature] Add API Tokens management page --- app/Filament/Pages/ApiTokens.php | 134 ++++++++++++++++++ composer.json | 1 + composer.lock | 65 ++++++++- .../views/filament/pages/api-tokens.blade.php | 11 ++ 4 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 app/Filament/Pages/ApiTokens.php create mode 100644 resources/views/filament/pages/api-tokens.blade.php diff --git a/app/Filament/Pages/ApiTokens.php b/app/Filament/Pages/ApiTokens.php new file mode 100644 index 000000000..5156c2631 --- /dev/null +++ b/app/Filament/Pages/ApiTokens.php @@ -0,0 +1,134 @@ +is_admin; + } + + public function tokenInfolist(Infolist $infolist): Infolist + { + return $infolist + ->state([ + 'token' => $this->token, + ]) + ->schema([ + Section::make() + ->columns(1) + ->schema([ + TextEntry::make('token') + ->label('API Token') + ->formatStateUsing(fn (string $state) => explode('|', $state)[1]) + ->helperText('Copy and save the token above, this token will not be shown again!') + ->color('gray') + ->copyable() + ->copyableState(fn (string $state) => explode('|', $state)[1]) + ->fontFamily(FontFamily::Mono), + ]), + ]); + } + + public function table(Table $table): Table + { + return $table + ->relationship(fn (): MorphMany => Auth::user()->tokens()) + ->headerActions([ + Action::make('createToken') + ->form([ + TextInput::make('token_name') + ->label('Name') + ->maxLength('100') + ->required(), + CheckboxList::make('token_abilities') + ->label('Abilities') + ->options([ + 'result:read' => 'Read results', + ]) + ->descriptions([ + 'result:read' => new HtmlString('Allow the token to retrieve result data.'), + ]) + ->required() + ->bulkToggleable(), + DateTimePicker::make('token_expires_at') + ->label('Expires at') + ->nullable(), + ]) + ->action(function (array $data) { + $token = Auth::user()->createToken( + name: $data['token_name'], + abilities: $data['token_abilities'], + expiresAt: $data['token_expires_at'] ? Carbon::parse($data['token_expires_at']) : null, + ); + + $this->token = $token->plainTextToken; + }) + ->label('Create API Token') + ->modal('createToken'), + ]) + ->columns([ + TextColumn::make('id') + ->label('ID') + ->sortable(), + TextColumn::make('name') + ->searchable(), + TextColumn::make('last_used_at') + ->alignEnd() + ->dateTime() + ->sortable(), + TextColumn::make('expires_at') + ->alignEnd() + ->dateTime() + ->sortable(), + ]) + ->actions([ + ActionGroup::make([ + DeleteAction::make(), + ]), + ]) + ->bulkActions([ + // ... + ]); + } +} diff --git a/composer.json b/composer.json index 8fb08b7e9..32e4084ee 100644 --- a/composer.json +++ b/composer.json @@ -31,6 +31,7 @@ "livewire/livewire": "^3.5.17", "lorisleiva/laravel-actions": "^2.8.4", "maennchen/zipstream-php": "^2.4", + "ryangjchandler/blade-tabler-icons": "^2.3", "spatie/laravel-settings": "^3.4", "spatie/laravel-webhook-server": "^3.8.2", "timokoerber/laravel-one-time-operations": "^1.4.4" diff --git a/composer.lock b/composer.lock index ebd736c25..4acd49a5d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9832b6f4e4ad294cd8cb7198af4fcc2c", + "content-hash": "829ec6300429de163e5ebfca768cc3c3", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -5941,6 +5941,69 @@ ], "time": "2024-02-26T18:08:49+00:00" }, + { + "name": "ryangjchandler/blade-tabler-icons", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/ryangjchandler/blade-tabler-icons.git", + "reference": "cd359f5d3b406a982dae1aaaf121d84067576a2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ryangjchandler/blade-tabler-icons/zipball/cd359f5d3b406a982dae1aaaf121d84067576a2e", + "reference": "cd359f5d3b406a982dae1aaaf121d84067576a2e", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.5", + "illuminate/support": "^10.0 || ^11.0", + "php": "^8.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.14", + "orchestra/testbench": "^8.0 || ^9.0", + "phpunit/phpunit": "^9.5.10 || ^10.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "RyanChandler\\TablerIcons\\BladeTablerIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "RyanChandler\\TablerIcons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ryan Chandler", + "email": "support@ryangjchandler.co.uk", + "homepage": "https://ryangjchandler.co.uk", + "role": "Developer" + } + ], + "description": "A package to easily make use of Tabler icons in your Laravel Blade views.", + "homepage": "https://github.com/ryangjchandler/blade-tabler-icons", + "keywords": [ + "blade", + "laravel", + "tabler" + ], + "support": { + "issues": "https://github.com/ryangjchandler/blade-tabler-icons/issues", + "source": "https://github.com/ryangjchandler/blade-tabler-icons/tree/v2.3.0" + }, + "abandoned": "secondnetwork/blade-tabler-icons", + "time": "2024-03-12T23:54:24+00:00" + }, { "name": "spatie/color", "version": "1.6.2", diff --git a/resources/views/filament/pages/api-tokens.blade.php b/resources/views/filament/pages/api-tokens.blade.php new file mode 100644 index 000000000..ff1070b8a --- /dev/null +++ b/resources/views/filament/pages/api-tokens.blade.php @@ -0,0 +1,11 @@ + + @filled($token) +
+ {{ $this->tokenInfolist }} +
+ @endfilled + +
+ {{ $this->table }} +
+
From b7639b16ea22d6bf203b05f8c15c84aaf8d402a1 Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Mon, 30 Dec 2024 19:48:57 -0500 Subject: [PATCH 2/2] [Feature] Set modal width for API Token creation to Extra Large --- app/Filament/Pages/ApiTokens.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Filament/Pages/ApiTokens.php b/app/Filament/Pages/ApiTokens.php index 5156c2631..2c8a3a5dc 100644 --- a/app/Filament/Pages/ApiTokens.php +++ b/app/Filament/Pages/ApiTokens.php @@ -10,12 +10,12 @@ use Filament\Forms\Contracts\HasForms; use Filament\Infolists\Components\Section; use Filament\Infolists\Components\TextEntry; -use Filament\Infolists\Components\TextEntry\TextEntrySize; use Filament\Infolists\Concerns\InteractsWithInfolists; use Filament\Infolists\Contracts\HasInfolists; use Filament\Infolists\Infolist; use Filament\Pages\Page; use Filament\Support\Enums\FontFamily; +use Filament\Support\Enums\MaxWidth; use Filament\Tables\Actions\Action; use Filament\Tables\Actions\ActionGroup; use Filament\Tables\Actions\DeleteAction; @@ -105,7 +105,8 @@ public function table(Table $table): Table $this->token = $token->plainTextToken; }) ->label('Create API Token') - ->modal('createToken'), + ->modal('createToken') + ->modalWidth(MaxWidth::ExtraLarge), ]) ->columns([ TextColumn::make('id')