Cleanup formatResource (#1563)

This commit is contained in:
Boy132 2025-07-31 23:02:27 +02:00 committed by GitHub
parent 88943563c7
commit 86a71afc6c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 80 additions and 45 deletions

View File

@ -2,9 +2,50 @@
namespace App\Enums; namespace App\Enums;
enum ServerResourceType use App\Models\Server;
enum ServerResourceType: string
{ {
case Unit; case Uptime = 'uptime';
case Percentage; case CPU = 'cpu_absolute';
case Time; case Memory = 'memory_bytes';
case Disk = 'disk_bytes';
case CPULimit = 'cpu';
case MemoryLimit = 'memory';
case DiskLimit = 'disk';
/**
* @return int resource amount in bytes
*/
public function getResourceAmount(Server $server): int
{
if ($this->isLimit()) {
$resourceAmount = $server->{$this->value} ?? 0;
if (!$this->isPercentage()) {
// Our limits are entered as MiB/ MB so we need to convert them to bytes
$resourceAmount *= config('panel.use_binary_prefix') ? 1024 * 1024 : 1000 * 1000;
}
return $resourceAmount;
}
return $server->retrieveResources()[$this->value] ?? 0;
}
public function isLimit(): bool
{
return $this === ServerResourceType::CPULimit || $this === ServerResourceType::MemoryLimit || $this === ServerResourceType::DiskLimit;
}
public function isTime(): bool
{
return $this === ServerResourceType::Uptime;
}
public function isPercentage(): bool
{
return $this === ServerResourceType::CPU || $this === ServerResourceType::CPULimit;
}
} }

View File

@ -8,7 +8,6 @@ use Filament\Support\Contracts\HasLabel;
enum ServerState: string implements HasColor, HasIcon, HasLabel enum ServerState: string implements HasColor, HasIcon, HasLabel
{ {
case Normal = 'normal';
case Installing = 'installing'; case Installing = 'installing';
case InstallFailed = 'install_failed'; case InstallFailed = 'install_failed';
case ReinstallFailed = 'reinstall_failed'; case ReinstallFailed = 'reinstall_failed';
@ -18,7 +17,6 @@ enum ServerState: string implements HasColor, HasIcon, HasLabel
public function getIcon(): string public function getIcon(): string
{ {
return match ($this) { return match ($this) {
self::Normal => 'tabler-heart',
self::Installing => 'tabler-heart-bolt', self::Installing => 'tabler-heart-bolt',
self::InstallFailed => 'tabler-heart-x', self::InstallFailed => 'tabler-heart-x',
self::ReinstallFailed => 'tabler-heart-x', self::ReinstallFailed => 'tabler-heart-x',
@ -31,14 +29,13 @@ enum ServerState: string implements HasColor, HasIcon, HasLabel
{ {
if ($hex) { if ($hex) {
return match ($this) { return match ($this) {
self::Normal, self::Installing, self::RestoringBackup => '#2563EB', self::Installing, self::RestoringBackup => '#2563EB',
self::Suspended => '#D97706', self::Suspended => '#D97706',
self::InstallFailed, self::ReinstallFailed => '#EF4444', self::InstallFailed, self::ReinstallFailed => '#EF4444',
}; };
} }
return match ($this) { return match ($this) {
self::Normal => 'primary',
self::Installing => 'primary', self::Installing => 'primary',
self::InstallFailed => 'danger', self::InstallFailed => 'danger',
self::ReinstallFailed => 'danger', self::ReinstallFailed => 'danger',

View File

@ -63,7 +63,7 @@ class ListServers extends ListRecords
TextColumn::make('condition') TextColumn::make('condition')
->label('Status') ->label('Status')
->badge() ->badge()
->tooltip(fn (Server $server) => $server->formatResource('uptime', type: ServerResourceType::Time)) ->tooltip(fn (Server $server) => $server->formatResource(ServerResourceType::Uptime))
->icon(fn (Server $server) => $server->condition->getIcon()) ->icon(fn (Server $server) => $server->condition->getIcon())
->color(fn (Server $server) => $server->condition->getColor()), ->color(fn (Server $server) => $server->condition->getColor()),
TextColumn::make('name') TextColumn::make('name')
@ -80,20 +80,20 @@ class ListServers extends ListRecords
TextColumn::make('cpuUsage') TextColumn::make('cpuUsage')
->label('Resources') ->label('Resources')
->icon('tabler-cpu') ->icon('tabler-cpu')
->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('cpu', limit: true, type: ServerResourceType::Percentage, precision: 0)) ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::CPULimit))
->state(fn (Server $server) => $server->formatResource('cpu_absolute', type: ServerResourceType::Percentage)) ->state(fn (Server $server) => $server->formatResource(ServerResourceType::CPU))
->color(fn (Server $server) => $this->getResourceColor($server, 'cpu')), ->color(fn (Server $server) => $this->getResourceColor($server, 'cpu')),
TextColumn::make('memoryUsage') TextColumn::make('memoryUsage')
->label('') ->label('')
->icon('tabler-device-desktop-analytics') ->icon('tabler-device-desktop-analytics')
->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('memory', limit: true)) ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::MemoryLimit))
->state(fn (Server $server) => $server->formatResource('memory_bytes')) ->state(fn (Server $server) => $server->formatResource(ServerResourceType::Memory))
->color(fn (Server $server) => $this->getResourceColor($server, 'memory')), ->color(fn (Server $server) => $this->getResourceColor($server, 'memory')),
TextColumn::make('diskUsage') TextColumn::make('diskUsage')
->label('') ->label('')
->icon('tabler-device-sd-card') ->icon('tabler-device-sd-card')
->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('disk', limit: true)) ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::DiskLimit))
->state(fn (Server $server) => $server->formatResource('disk_bytes')) ->state(fn (Server $server) => $server->formatResource(ServerResourceType::Disk))
->color(fn (Server $server) => $this->getResourceColor($server, 'disk')), ->color(fn (Server $server) => $this->getResourceColor($server, 'disk')),
]; ];
} }

View File

@ -24,32 +24,35 @@ class ServerEntry extends Component
style="background-color: #D97706;"> style="background-color: #D97706;">
</div> </div>
<div class="flex-1 dark:bg-gray-850 dark:text-white rounded-lg overflow-hidden p-2"> <div class="flex-1 dark:bg-gray-800 dark:text-white rounded-lg overflow-hidden p-3">
<div class="flex items-center mb-5 gap-2"> <div class="flex items-center mb-5 gap-2">
<x-filament::loading-indicator class="h-5 w-5" /> <x-filament::loading-indicator class="h-6 w-6" />
<h2 class="text-xl font-bold"> <h2 class="text-xl font-bold">
{{ $server->name }} {{ $server->name }}
<span class="dark:text-gray-400">
(Loading)
</span>
</h2> </h2>
</div> </div>
<div class="flex justify-between text-center"> <div class="flex justify-between text-center items-center gap-4">
<div> <div>
<p class="text-sm dark:text-gray-400">CPU</p> <p class="text-sm dark:text-gray-400">CPU</p>
<p class="text-md font-semibold">{{ Number::format(0, precision: 2, locale: auth()->user()->language ?? 'en') . '%' }}</p> <p class="text-md font-semibold">{{ Number::format(0, precision: 2, locale: auth()->user()->language ?? 'en') . '%' }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('cpu', type: \App\Enums\ServerResourceType::Percentage, limit: true) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::CPULimit) }}</p>
</div> </div>
<div> <div>
<p class="text-sm dark:text-gray-400">Memory</p> <p class="text-sm dark:text-gray-400">Memory</p>
<p class="text-md font-semibold">{{ convert_bytes_to_readable(0, decimals: 2) }}</p> <p class="text-md font-semibold">{{ convert_bytes_to_readable(0, decimals: 2) }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('memory', limit: true) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::MemoryLimit) }}</p>
</div> </div>
<div> <div>
<p class="text-sm dark:text-gray-400">Disk</p> <p class="text-sm dark:text-gray-400">Disk</p>
<p class="text-md font-semibold">{{ convert_bytes_to_readable(0, decimals: 2) }}</p> <p class="text-md font-semibold">{{ convert_bytes_to_readable(0, decimals: 2) }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('disk', limit: true) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::DiskLimit) }}</p>
</div> </div>
<div class="hidden sm:block"> <div class="hidden sm:block">
<p class="text-sm dark:text-gray-400">Network</p> <p class="text-sm dark:text-gray-400">Network</p>

View File

@ -462,17 +462,15 @@ class Server extends Model implements Validatable
}); });
} }
public function formatResource(string $resourceKey, bool $limit = false, ServerResourceType $type = ServerResourceType::Unit, int $precision = 2): string public function formatResource(ServerResourceType $resourceType): string
{ {
$resourceAmount = $this->{$resourceKey} ?? 0; $resourceAmount = $resourceType->getResourceAmount($this);
if (!$limit) {
$resourceAmount = $this->retrieveResources()[$resourceKey] ?? 0;
}
if ($type === ServerResourceType::Time) { if ($resourceType->isTime()) {
if ($this->isSuspended()) { if (!is_null($this->status)) {
return 'Suspended'; return $this->status->getLabel();
} }
if ($resourceAmount === 0) { if ($resourceAmount === 0) {
return ContainerStatus::Offline->getLabel(); return ContainerStatus::Offline->getLabel();
} }
@ -480,20 +478,16 @@ class Server extends Model implements Validatable
return now()->subMillis($resourceAmount)->diffForHumans(syntax: CarbonInterface::DIFF_ABSOLUTE, short: true, parts: 4); return now()->subMillis($resourceAmount)->diffForHumans(syntax: CarbonInterface::DIFF_ABSOLUTE, short: true, parts: 4);
} }
if ($resourceAmount === 0 & $limit) { if ($resourceAmount === 0 & $resourceType->isLimit()) {
// Unlimited symbol
return "\u{221E}"; return "\u{221E}";
} }
if ($type === ServerResourceType::Percentage) { if ($resourceType->isPercentage()) {
return Number::format($resourceAmount, precision: $precision, locale: auth()->user()->language ?? 'en') . '%'; return Number::format($resourceAmount, precision: 2, locale: auth()->user()->language ?? 'en') . '%';
} }
// Our current limits are set in MB return convert_bytes_to_readable($resourceAmount, base: 3);
if ($limit) {
$resourceAmount *= 2 ** 20;
}
return convert_bytes_to_readable($resourceAmount, decimals: $precision, base: 3);
} }
public function condition(): Attribute public function condition(): Attribute

View File

@ -17,7 +17,7 @@
<h2 class="text-xl font-bold"> <h2 class="text-xl font-bold">
{{ $server->name }} {{ $server->name }}
<span class="dark:text-gray-400"> <span class="dark:text-gray-400">
({{ $server->formatResource('uptime', type: \App\Enums\ServerResourceType::Time) }}) ({{ $server->formatResource(\App\Enums\ServerResourceType::Uptime) }})
</span> </span>
</h2> </h2>
<div class="end-0" x-on:click.stop> <div class="end-0" x-on:click.stop>
@ -34,21 +34,21 @@
<div class="flex justify-between text-center items-center gap-4"> <div class="flex justify-between text-center items-center gap-4">
<div> <div>
<p class="text-sm dark:text-gray-400">CPU</p> <p class="text-sm dark:text-gray-400">CPU</p>
<p class="text-md font-semibold">{{ $server->formatResource('cpu_absolute', type: \App\Enums\ServerResourceType::Percentage) }}</p> <p class="text-md font-semibold">{{ $server->formatResource(\App\Enums\ServerResourceType::CPU) }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('cpu', limit: true, type: \App\Enums\ServerResourceType::Percentage) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::CPULimit) }}</p>
</div> </div>
<div> <div>
<p class="text-sm dark:text-gray-400">Memory</p> <p class="text-sm dark:text-gray-400">Memory</p>
<p class="text-md font-semibold">{{ $server->formatResource('memory_bytes') }}</p> <p class="text-md font-semibold">{{ $server->formatResource(\App\Enums\ServerResourceType::Memory) }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('memory', limit: true) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::MemoryLimit) }}</p>
</div> </div>
<div> <div>
<p class="text-sm dark:text-gray-400">Disk</p> <p class="text-sm dark:text-gray-400">Disk</p>
<p class="text-md font-semibold">{{ $server->formatResource('disk_bytes') }}</p> <p class="text-md font-semibold">{{ $server->formatResource(\App\Enums\ServerResourceType::Disk) }}</p>
<hr class="p-0.5"> <hr class="p-0.5">
<p class="text-xs dark:text-gray-400">{{ $server->formatResource('disk', limit: true) }}</p> <p class="text-xs dark:text-gray-400">{{ $server->formatResource(\App\Enums\ServerResourceType::DiskLimit) }}</p>
</div> </div>
<div class="hidden sm:block"> <div class="hidden sm:block">
<p class="text-sm dark:text-gray-400">Network</p> <p class="text-sm dark:text-gray-400">Network</p>