From efb834c8f7aa8f864c870883358ae53c1b96c316 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Tue, 25 Jun 2024 20:30:06 -0400 Subject: [PATCH] Combine Server states and statuses and resolve #362 (#417) * Simplify states and statuses and resolve #362 # Conflicts: # app/Models/Server.php * Move Random button... Moves button to the info tab --------- Co-authored-by: notCharles --- app/Enums/ContainerStatus.php | 3 + .../ServerResource/Pages/EditServer.php | 84 ++++++------------- .../ServerResource/Pages/ListServers.php | 23 +---- app/Models/Server.php | 44 +++++++++- 4 files changed, 75 insertions(+), 79 deletions(-) diff --git a/app/Enums/ContainerStatus.php b/app/Enums/ContainerStatus.php index ba9effa64..b3b57d2b0 100644 --- a/app/Enums/ContainerStatus.php +++ b/app/Enums/ContainerStatus.php @@ -12,6 +12,7 @@ enum ContainerStatus: string case Paused = 'paused'; case Dead = 'dead'; case Removing = 'removing'; + case Offline = 'offline'; // HTTP Based case Missing = 'missing'; @@ -27,6 +28,7 @@ enum ContainerStatus: string self::Dead => 'tabler-heart-x', self::Removing => 'tabler-heart-down', self::Missing => 'tabler-heart-question', + self::Offline => 'tabler-heart-bolt', }; } @@ -41,6 +43,7 @@ enum ContainerStatus: string self::Dead => 'danger', self::Removing => 'warning', self::Missing => 'danger', + self::Offline => 'gray', }; } } diff --git a/app/Filament/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Resources/ServerResource/Pages/EditServer.php index a32928b58..3a18664e8 100644 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Resources/ServerResource/Pages/EditServer.php @@ -20,7 +20,6 @@ use App\Enums\ServerState; use App\Models\Egg; use App\Models\Server; use App\Models\ServerVariable; -use App\Repositories\Daemon\DaemonServerRepository; use App\Services\Servers\ServerDeletionService; use Filament\Forms\Components\Tabs; use Filament\Forms\Form; @@ -44,55 +43,6 @@ class EditServer extends EditRecord 'lg' => 4, ]) ->schema([ - Forms\Components\ToggleButtons::make('docker') - ->label('Container Status')->inline()->inlineLabel() - ->formatStateUsing(function ($state, Server $server) { - if ($server->node_id === null) { - return 'unknown'; - } - - /** @var DaemonServerRepository $service */ - $service = resolve(DaemonServerRepository::class); - $details = $service->setServer($server)->getDetails(); - - return $details['state'] ?? 'unknown'; - }) - ->options(fn ($state) => collect(ContainerStatus::cases())->filter(fn ($containerStatus) => $containerStatus->value === $state)->mapWithKeys( - fn (ContainerStatus $state) => [$state->value => str($state->value)->replace('_', ' ')->ucwords()] - )) - ->colors(collect(ContainerStatus::cases())->mapWithKeys( - fn (ContainerStatus $status) => [$status->value => $status->color()] - )) - ->icons(collect(ContainerStatus::cases())->mapWithKeys( - fn (ContainerStatus $status) => [$status->value => $status->icon()] - )) - ->columnSpan([ - 'default' => 1, - 'sm' => 2, - 'md' => 2, - 'lg' => 2, - ]), - - Forms\Components\ToggleButtons::make('status') - ->label('Server State')->inline()->inlineLabel() - ->helperText('') - ->formatStateUsing(fn ($state) => $state ?? ServerState::Normal) - ->options(fn ($state) => collect(ServerState::cases())->filter(fn ($serverState) => $serverState->value === $state)->mapWithKeys( - fn (ServerState $state) => [$state->value => str($state->value)->replace('_', ' ')->ucwords()] - )) - ->colors(collect(ServerState::cases())->mapWithKeys( - fn (ServerState $state) => [$state->value => $state->color()] - )) - ->icons(collect(ServerState::cases())->mapWithKeys( - fn (ServerState $state) => [$state->value => $state->icon()] - )) - ->columnSpan([ - 'default' => 1, - 'sm' => 2, - 'md' => 2, - 'lg' => 2, - ]), - Tabs::make('Tabs') ->persistTabInQueryString() ->columnSpan(6) @@ -121,7 +71,7 @@ class EditServer extends EditRecord })) ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, 'lg' => 3, ]) @@ -133,15 +83,35 @@ class EditServer extends EditRecord ->label('Owner') ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, - 'lg' => 3, + 'lg' => 2, ]) ->relationship('user', 'username') ->searchable() ->preload() ->required(), + Forms\Components\ToggleButtons::make('condition') + ->label('Server Status') + ->formatStateUsing(fn (Server $server) => $server->condition) + ->options(fn ($state) => collect(array_merge(ContainerStatus::cases(), ServerState::cases())) + ->filter(fn ($condition) => $condition->value === $state) + ->mapWithKeys(fn ($state) => [$state->value => str($state->value)->replace('_', ' ')->ucwords()]) + ) + ->colors(collect(array_merge(ContainerStatus::cases(), ServerState::cases()))->mapWithKeys( + fn ($status) => [$status->value => $status->color()] + )) + ->icons(collect(array_merge(ContainerStatus::cases(), ServerState::cases()))->mapWithKeys( + fn ($status) => [$status->value => $status->icon()] + )) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]), + Forms\Components\Textarea::make('description') ->label('Description') ->columnSpanFull(), @@ -150,7 +120,7 @@ class EditServer extends EditRecord ->hintAction(CopyAction::make()) ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, 'lg' => 3, ]) @@ -160,7 +130,7 @@ class EditServer extends EditRecord ->hintAction(CopyAction::make()) ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, 'lg' => 3, ]) @@ -169,7 +139,7 @@ class EditServer extends EditRecord ->label('External ID') ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, 'lg' => 3, ]) @@ -179,7 +149,7 @@ class EditServer extends EditRecord ->relationship('node', 'name') ->columnSpan([ 'default' => 2, - 'sm' => 2, + 'sm' => 1, 'md' => 2, 'lg' => 3, ]) diff --git a/app/Filament/Resources/ServerResource/Pages/ListServers.php b/app/Filament/Resources/ServerResource/Pages/ListServers.php index 0d28c23fc..bd0f1fa21 100644 --- a/app/Filament/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/Resources/ServerResource/Pages/ListServers.php @@ -26,28 +26,11 @@ class ListServers extends ListRecords Group::make('egg.name')->getDescriptionFromRecordUsing(fn (Server $server): string => str($server->egg->description)->limit(150)), ]) ->columns([ - Tables\Columns\TextColumn::make('status') + Tables\Columns\TextColumn::make('condition') ->default('unknown') ->badge() - ->default(fn (Server $server) => $server->status ?? $server->retrieveStatus()) - ->icon(fn ($state) => match ($state) { - 'node_fail' => 'tabler-server-off', - 'running' => 'tabler-heartbeat', - 'removing' => 'tabler-heart-x', - 'offline' => 'tabler-heart-off', - 'paused' => 'tabler-heart-pause', - 'installing' => 'tabler-heart-bolt', - 'suspended' => 'tabler-heart-cancel', - default => 'tabler-heart-question', - }) - ->color(fn ($state): string => match ($state) { - 'running' => 'success', - 'installing', 'restarting' => 'primary', - 'paused', 'removing' => 'warning', - 'node_fail', 'install_failed', 'suspended' => 'danger', - default => 'gray', - }), - + ->icon(fn (Server $server) => $server->conditionIcon()) + ->color(fn (Server $server) => $server->conditionColor()), Tables\Columns\TextColumn::make('uuid') ->hidden() ->label('UUID') diff --git a/app/Models/Server.php b/app/Models/Server.php index adb5ab98e..a0c341c6d 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -2,9 +2,11 @@ namespace App\Models; +use App\Enums\ContainerStatus; use App\Enums\ServerState; use App\Exceptions\Http\Connection\DaemonConnectionException; use GuzzleHttp\Exception\GuzzleException; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Query\JoinClause; @@ -69,7 +71,6 @@ use App\Exceptions\Http\Server\ServerStateConflictException; * @property \App\Models\User $user * @property \Illuminate\Database\Eloquent\Collection|\App\Models\EggVariable[] $variables * @property int|null $variables_count - * * @method static \Database\Factories\ServerFactory factory(...$parameters) * @method static \Illuminate\Database\Eloquent\Builder|Server newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Server newQuery() @@ -100,7 +101,17 @@ use App\Exceptions\Http\Server\ServerStateConflictException; * @method static \Illuminate\Database\Eloquent\Builder|Server whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuid($value) * @method static \Illuminate\Database\Eloquent\Builder|Server whereuuid_short($value) - * + * @property array|null $docker_labels + * @property string|null $ports + * @property-read mixed $condition + * @property-read \Illuminate\Database\Eloquent\Collection $eggVariables + * @property-read int|null $egg_variables_count + * @property-read \Illuminate\Database\Eloquent\Collection $serverVariables + * @property-read int|null $server_variables_count + * @method static \Illuminate\Database\Eloquent\Builder|Server whereDockerLabels($value) + * @method static \Illuminate\Database\Eloquent\Builder|Server whereInstalledAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Server wherePorts($value) + * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuidShort($value) * @mixin \Eloquent */ class Server extends Model @@ -410,4 +421,33 @@ class Server extends Model return cache()->get("servers.$this->uuid.container.status") ?? 'missing'; } + + public function condition(): Attribute + { + return Attribute::make( + get: fn () => $this->status?->value ?? $this->retrieveStatus(), + ); + } + + public function conditionIcon(): string + { + if ($this->status === null) { + $containerStatus = ContainerStatus::from($this->retrieveStatus()); + + return $containerStatus->icon(); + } + + return $this->status->icon(); + } + + public function conditionColor(): string + { + if ($this->status === null) { + $containerStatus = ContainerStatus::from($this->retrieveStatus()); + + return $containerStatus->color(); + } + + return $this->status->color(); + } }