diff --git a/app/Filament/Resources/Results/Tables/ResultTable.php b/app/Filament/Resources/Results/Tables/ResultTable.php index c7d8adbe2..6808e9f7d 100644 --- a/app/Filament/Resources/Results/Tables/ResultTable.php +++ b/app/Filament/Resources/Results/Tables/ResultTable.php @@ -4,6 +4,7 @@ use App\Enums\ResultStatus; use App\Filament\Exports\ResultExporter; +use App\Filament\Tables\Columns\ResultServerColumn; use App\Helpers\Number; use App\Models\Result; use Filament\Actions\Action; @@ -49,19 +50,9 @@ public static function table(Table $table): Table ->label(__('results.service')) ->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('data.server.id') - ->label(__('results.server_id')) - ->toggleable(isToggledHiddenByDefault: false) - ->sortable(query: function (Builder $query, string $direction): Builder { - return $query->orderBy('data->server->id', $direction); - }), - - TextColumn::make('data.server.name') - ->label(__('results.server_name')) - ->toggleable(isToggledHiddenByDefault: false) - ->sortable(query: function (Builder $query, string $direction): Builder { - return $query->orderBy('data->server->name', $direction); - }), + ResultServerColumn::make('server') + ->label(__('general.server')) + ->toggleable(isToggledHiddenByDefault: false), TextColumn::make('download') ->label(__('results.download')) @@ -131,7 +122,7 @@ public static function table(Table $table): Table ->label(__('general.created_at')) ->dateTime(config('app.datetime_format')) ->timezone(config('app.display_timezone')) - ->toggleable(isToggledHiddenByDefault: true) + ->toggleable(isToggledHiddenByDefault: false) ->sortable(), ]) ->filters([ @@ -158,6 +149,7 @@ public static function table(Table $table): Table fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date), ); }), + SelectFilter::make('ip_address') ->label(__('results.ip_address')) ->multiple() @@ -175,6 +167,7 @@ public static function table(Table $table): Table ->toArray(); }) ->attribute('data->interface->externalIp'), + SelectFilter::make('server_name') ->label(__('results.server_name')) ->multiple() @@ -192,6 +185,25 @@ public static function table(Table $table): Table ->toArray(); }) ->attribute('data->server->name'), + + SelectFilter::make('server_id') + ->label(__('results.server_id')) + ->multiple() + ->options(function (): array { + return Result::query() + ->select('data->server->id AS data_server_id') + ->whereNotNull('data->server->id') + ->where('status', '=', ResultStatus::Completed) + ->distinct() + ->orderBy('data->server->id') + ->get() + ->mapWithKeys(function (Result $item, int $key) { + return [$item['data_server_id'] => $item['data_server_id']]; + }) + ->toArray(); + }) + ->attribute('data->server->id'), + TernaryFilter::make('scheduled') ->label(__('results.scheduled')) ->nullable() @@ -203,10 +215,12 @@ public static function table(Table $table): Table false: fn (Builder $query) => $query->where('scheduled', false), blank: fn (Builder $query) => $query, ), + SelectFilter::make('status') ->label(__('general.status')) ->multiple() ->options(ResultStatus::class), + TernaryFilter::make('healthy') ->label(__('general.healthy')) ->nullable() diff --git a/app/Filament/Tables/Columns/ResultServerColumn.php b/app/Filament/Tables/Columns/ResultServerColumn.php new file mode 100644 index 000000000..357951e15 --- /dev/null +++ b/app/Filament/Tables/Columns/ResultServerColumn.php @@ -0,0 +1,28 @@ +serverName = $this->record->server_name; + + return $this->serverName; + } + + public function getServerId(): ?int + { + $this->serverId = $this->record->server_id; + + return $this->serverId; + } +} diff --git a/app/Listeners/ProcessCompletedSpeedtest.php b/app/Listeners/ProcessCompletedSpeedtest.php index 66b927f1a..1b72f3053 100644 --- a/app/Listeners/ProcessCompletedSpeedtest.php +++ b/app/Listeners/ProcessCompletedSpeedtest.php @@ -88,7 +88,7 @@ private function notifyAppriseChannels(Result $result): void } Notification::route('apprise_urls', $channelUrl) - ->notify(new SpeedtestNotification($title, $body, 'info')); + ->notify(new SpeedtestNotification($title, $body, 'info', 'markdown')); } } diff --git a/app/Listeners/ProcessUnhealthySpeedtest.php b/app/Listeners/ProcessUnhealthySpeedtest.php index 68b9b6a9b..4f51e4267 100644 --- a/app/Listeners/ProcessUnhealthySpeedtest.php +++ b/app/Listeners/ProcessUnhealthySpeedtest.php @@ -110,7 +110,7 @@ private function notifyAppriseChannels(Result $result): void } Notification::route('apprise_urls', $channelUrl) - ->notify(new SpeedtestNotification($title, $body, 'warning')); + ->notify(new SpeedtestNotification($title, $body, 'warning', 'markdown')); } } diff --git a/app/Notifications/Apprise/SpeedtestNotification.php b/app/Notifications/Apprise/SpeedtestNotification.php index 3c2ffb3cd..710466e57 100644 --- a/app/Notifications/Apprise/SpeedtestNotification.php +++ b/app/Notifications/Apprise/SpeedtestNotification.php @@ -14,6 +14,7 @@ public function __construct( public string $title, public string $body, public string $type = 'info', + public string $format = 'markdown', ) {} /** @@ -35,6 +36,7 @@ public function toApprise(object $notifiable): AppriseMessage ->urls($notifiable->routes['apprise_urls']) ->title($this->title) ->body($this->body) - ->type($this->type); + ->type($this->type) + ->format($this->format); } } diff --git a/app/Notifications/Apprise/TestNotification.php b/app/Notifications/Apprise/TestNotification.php index f07810fcc..8ba9011cc 100644 --- a/app/Notifications/Apprise/TestNotification.php +++ b/app/Notifications/Apprise/TestNotification.php @@ -25,10 +25,14 @@ public function via(object $notifiable): array */ public function toApprise(object $notifiable): AppriseMessage { + $body = '👋 This is a test notification from **'.config('app.name')."**.\n\n"; + $body .= "If you're seeing this, your Apprise notification channel is configured correctly!\n\n"; + return AppriseMessage::create() ->urls($notifiable->routes['apprise_urls']) ->title('Test Notification') - ->body('👋 Testing the Apprise notification channel.') - ->type('info'); + ->body($body) + ->type('info') + ->format('markdown'); } } diff --git a/config/speedtest.php b/config/speedtest.php index 413914928..dfaf9ac76 100644 --- a/config/speedtest.php +++ b/config/speedtest.php @@ -6,9 +6,9 @@ /** * General settings. */ - 'build_date' => Carbon::parse('2025-12-06'), + 'build_date' => Carbon::parse('2025-12-08'), - 'build_version' => 'v1.12.2', + 'build_version' => 'v1.12.3', 'content_width' => env('CONTENT_WIDTH', '7xl'), diff --git a/lang/en/general.php b/lang/en/general.php index 33c212e21..9b8aa7d95 100644 --- a/lang/en/general.php +++ b/lang/en/general.php @@ -37,6 +37,8 @@ 'created_at' => 'Created at', 'updated_at' => 'Updated at', 'url' => 'URL', + 'server' => 'Server', + 'servers' => 'Servers', 'stats' => 'Stats', 'statistics' => 'Statistics', diff --git a/resources/views/apprise/speedtest-completed.blade.php b/resources/views/apprise/speedtest-completed.blade.php index 6363ee642..2efca5492 100644 --- a/resources/views/apprise/speedtest-completed.blade.php +++ b/resources/views/apprise/speedtest-completed.blade.php @@ -1,11 +1,13 @@ -A new speedtest on {{ config('app.name') }} was completed using {{ $service }}. +A new speedtest on **{{ config('app.name') }}** was completed using **{{ $service }}**. -Server name: {{ $serverName }} -Server ID: {{ $serverId }} -ISP: {{ $isp }} -Ping: {{ $ping }} -Download: {{ $download }} -Upload: {{ $upload }} -Packet Loss: {{ $packetLoss }} % -Ookla Speedtest: {{ $speedtest_url }} -URL: {{ $url }} +### Results +- **Server:** {{ $serverName }} (ID: {{ $serverId }}) +- **ISP:** {{ $isp }} +- **Ping:** {{ $ping }} +- **Download:** {{ $download }} +- **Upload:** {{ $upload }} +- **Packet Loss:** {{ $packetLoss }}% + +### Links +- [View Ookla Results]({{ $speedtest_url }}) +- [View Dashboard]({{ $url }}) diff --git a/resources/views/apprise/speedtest-threshold.blade.php b/resources/views/apprise/speedtest-threshold.blade.php index 6d0bb4926..14a719d0e 100644 --- a/resources/views/apprise/speedtest-threshold.blade.php +++ b/resources/views/apprise/speedtest-threshold.blade.php @@ -1,7 +1,12 @@ -A new speedtest on **{{ config('app.name') }}** was completed using **{{ $service }}** on **{{ $isp }}** but a threshold was breached. - +A new speedtest on **{{ config('app.name') }}** was completed using **{{ $service }}** on **{{ $isp }}** but a threshold was breached +### Failed Metrics @foreach ($metrics as $item) -- **{{ $item['name'] }}** {{ $item['threshold'] }}: {{ $item['value'] }} +- **{{ $item['name'] }}** + - **Threshold:** {{ $item['threshold'] }} | **Actual:** {{ $item['value'] }} @endforeach -- **Ookla Speedtest:** {{ $speedtest_url }} -- **URL:** {{ $url }} +### Server Information +- **Server:** {{ $serverName }} (ID: {{ $serverId }}) +- **ISP:** {{ $isp }} +### Links +- [View Ookla Results]({{ $speedtest_url }}) +- [View Dashboard]({{ $url }}) diff --git a/resources/views/filament/tables/columns/result-server-column.blade.php b/resources/views/filament/tables/columns/result-server-column.blade.php new file mode 100644 index 000000000..f16445828 --- /dev/null +++ b/resources/views/filament/tables/columns/result-server-column.blade.php @@ -0,0 +1,7 @@ +
+ {{ $getServerName() }} + + @isset($getServerId) + (#{{ $getServerId() }}) + @endisset +
diff --git a/resources/views/livewire/latest-result-stats.blade.php b/resources/views/livewire/latest-result-stats.blade.php index c6dfbd850..a3cc2b708 100644 --- a/resources/views/livewire/latest-result-stats.blade.php +++ b/resources/views/livewire/latest-result-stats.blade.php @@ -9,7 +9,7 @@ Latest result -

{{ $this->latestResult->created_at->format(config('app.datetime_format')) }}

+

{{ $this->latestResult->created_at->timezone(config('app.display_timezone'))->format(config('app.datetime_format')) }}

@auth @@ -130,7 +130,7 @@ @endfilled

- {{ $this->latestResult?->ping }} + {{ round($this->latestResult?->ping, 2) }} ms