mirror of
https://github.com/alexjustesen/speedtest-tracker.git
synced 2026-06-23 07:40:08 +00:00
Add list Ookla servers page (#2374)
Co-authored-by: Alex Justesen <1144087+alexjustesen@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Pages\Tools;
|
||||
|
||||
use App\Actions\GetOoklaSpeedtestServers;
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Notifications\Notification;
|
||||
use Filament\Pages\Page;
|
||||
|
||||
class ListOoklaServers extends Page implements HasForms
|
||||
{
|
||||
use InteractsWithForms;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-server-stack';
|
||||
|
||||
protected static ?string $navigationGroup = 'Tools';
|
||||
|
||||
protected static ?string $title = 'List Ookla Servers';
|
||||
|
||||
protected static ?string $navigationLabel = 'List Ookla Servers';
|
||||
|
||||
protected static string $view = 'filament.pages.tools.list-ookla-servers';
|
||||
|
||||
protected static ?string $slug = 'tools/list-ookla-servers';
|
||||
|
||||
public static function shouldRegisterNavigation(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public ?string $servers = null;
|
||||
|
||||
public bool $isLoading = true;
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$this->fetchServers();
|
||||
}
|
||||
|
||||
public function fetchServers(): void
|
||||
{
|
||||
$this->isLoading = true;
|
||||
|
||||
try {
|
||||
$servers = GetOoklaSpeedtestServers::fetch();
|
||||
|
||||
$this->servers = json_encode($servers, JSON_PRETTY_PRINT);
|
||||
|
||||
$this->form->fill([
|
||||
'servers' => $this->servers,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
Notification::make()
|
||||
->title('Error fetching servers')
|
||||
->body($e->getMessage())
|
||||
->danger()
|
||||
->send();
|
||||
|
||||
$this->servers = '';
|
||||
$this->form->fill([
|
||||
'servers' => '',
|
||||
]);
|
||||
} finally {
|
||||
$this->isLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
public function form(Form $form): Form
|
||||
{
|
||||
return $form
|
||||
->schema([
|
||||
Textarea::make('servers')
|
||||
->label(false)
|
||||
->rows(20)
|
||||
->columnSpanFull()
|
||||
->extraAttributes(['class' => 'font-mono'])
|
||||
->disabled(),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Action::make('refreshServers')
|
||||
->label('Refresh')
|
||||
->icon('heroicon-o-arrow-path')
|
||||
->action(function () {
|
||||
$this->fetchServers();
|
||||
|
||||
Notification::make()
|
||||
->title('Servers refreshed successfully')
|
||||
->success()
|
||||
->send();
|
||||
}),
|
||||
|
||||
Action::make('copyServers')
|
||||
->label('Copy to Clipboard')
|
||||
->icon('heroicon-o-clipboard')
|
||||
->disabled(fn () => blank($this->servers))
|
||||
->requiresConfirmation(false)
|
||||
->action(function () {
|
||||
$this->js('navigator.clipboard.writeText('.json_encode($this->servers).')');
|
||||
|
||||
Notification::make()
|
||||
->title('Copied to clipboard')
|
||||
->success()
|
||||
->send();
|
||||
}),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<x-filament-panels::page>
|
||||
@if ($isLoading)
|
||||
<div class="flex items-center justify-center p-12">
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<x-filament::loading-indicator class="h-8 w-8" />
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400">Loading Ookla servers...</p>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<x-filament-panels::form wire:submit.prevent>
|
||||
{{ $this->form }}
|
||||
</x-filament-panels::form>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
Reference in New Issue
Block a user