Skip to content

Commit 462bb59

Browse files
authored
Failed speedtests (alexjustesen#318)
1 parent 755ba47 commit 462bb59

File tree

18 files changed

+269
-232
lines changed

18 files changed

+269
-232
lines changed

.phpstorm.meta.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
145145
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
146146
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
147+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
147148
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
148149
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
149150
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -351,6 +352,7 @@
351352
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
352353
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
353354
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
355+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
354356
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
355357
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
356358
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -558,6 +560,7 @@
558560
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
559561
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
560562
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
563+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
561564
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
562565
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
563566
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -765,6 +768,7 @@
765768
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
766769
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
767770
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
771+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
768772
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
769773
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
770774
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -972,6 +976,7 @@
972976
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
973977
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
974978
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
979+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
975980
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
976981
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
977982
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -1179,6 +1184,7 @@
11791184
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
11801185
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
11811186
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
1187+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
11821188
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
11831189
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
11841190
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -1386,6 +1392,7 @@
13861392
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
13871393
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
13881394
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
1395+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
13891396
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
13901397
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
13911398
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -1593,6 +1600,7 @@
15931600
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
15941601
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
15951602
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
1603+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
15961604
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
15971605
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
15981606
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -1800,6 +1808,7 @@
18001808
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
18011809
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
18021810
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
1811+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
18031812
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
18041813
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
18051814
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -2007,6 +2016,7 @@
20072016
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
20082017
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
20092018
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
2019+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
20102020
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
20112021
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
20122022
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,
@@ -2214,6 +2224,7 @@
22142224
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
22152225
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
22162226
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
2227+
'NotificationChannels\Telegram\Telegram' => \NotificationChannels\Telegram\Telegram::class,
22172228
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
22182229
'Spatie\FlareClient\Flare' => \Spatie\FlareClient\Flare::class,
22192230
'Spatie\Ignition\Config\IgnitionConfig' => \Spatie\Ignition\Config\IgnitionConfig::class,

app/Filament/Pages/Dashboard.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ protected function getActions(): array
5252

5353
public function getHeaderWidgets(): array
5454
{
55-
if (! $this->resultsCount) {
56-
return [];
57-
}
58-
5955
return [
6056
StatsOverview::class,
6157
];
@@ -85,8 +81,6 @@ public function queueSpeedtest(GeneralSettings $settings)
8581
}
8682

8783
$speedtest = [
88-
'enabled' => ! blank($settings->speedtest_schedule),
89-
'schedule' => optional($settings)->speedtest_schedule,
9084
'ookla_server_id' => $ookla_server_id,
9185
];
9286

app/Filament/Resources/ResultResource.php

Lines changed: 113 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
use App\Filament\Resources\ResultResource\Pages;
66
use App\Models\Result;
77
use App\Settings\GeneralSettings;
8+
use Carbon\Carbon;
9+
use Filament\Forms;
10+
use Filament\Forms\Components\TextInput;
11+
use Filament\Resources\Form;
812
use Filament\Resources\Resource;
913
use Filament\Resources\Table;
1014
use Filament\Tables;
1115
use Filament\Tables\Actions\Action;
1216
use Filament\Tables\Columns\IconColumn;
1317
use Filament\Tables\Columns\TextColumn;
14-
use Filament\Tables\Columns\ViewColumn;
18+
use Illuminate\Database\Eloquent\Builder;
1519

1620
class ResultResource extends Resource
1721
{
@@ -21,6 +25,71 @@ class ResultResource extends Resource
2125

2226
protected static ?string $navigationLabel = 'Results';
2327

28+
public static function form(Form $form): Form
29+
{
30+
$settings = new GeneralSettings();
31+
32+
return $form
33+
->schema([
34+
Forms\Components\Grid::make([
35+
'default' => 2,
36+
'md' => 3,
37+
])->schema([
38+
Forms\Components\Grid::make([
39+
'default' => 2,
40+
'md' => 3,
41+
])
42+
->schema([
43+
Forms\Components\TextInput::make('id')
44+
->label('ID'),
45+
Forms\Components\TextInput::make('created_at')
46+
->label('Created')
47+
->afterStateHydrated(function (TextInput $component, $state) use ($settings) {
48+
$component->state(Carbon::parse($state)->format($settings->time_format ?? 'M j, Y G:i:s'));
49+
})
50+
->columnSpan(2),
51+
Forms\Components\TextInput::make('server_id')
52+
->label('Server ID'),
53+
Forms\Components\TextInput::make('server_name')
54+
->label('Server name')
55+
->columnSpan(2),
56+
Forms\Components\TextInput::make('server_host')
57+
->label('Server host')
58+
->columnSpan([
59+
'default' => 2,
60+
'md' => 3,
61+
]),
62+
Forms\Components\TextInput::make('download')
63+
->label('Download (Mbps)')
64+
->afterStateHydrated(function (TextInput $component, $state) {
65+
$component->state(! blank($state) ? formatBits(formatBytestoBits($state), 3, false) : '');
66+
}),
67+
Forms\Components\TextInput::make('upload')
68+
->label('Upload (Mbps)')
69+
->afterStateHydrated(function (TextInput $component, $state) {
70+
$component->state(! blank($state) ? formatBits(formatBytestoBits($state), 3, false) : '');
71+
}),
72+
Forms\Components\TextInput::make('ping')
73+
->label('Ping (Ms)'),
74+
])
75+
->columnSpan(2),
76+
Forms\Components\Card::make()
77+
->schema([
78+
Forms\Components\Checkbox::make('successful'),
79+
Forms\Components\Checkbox::make('scheduled'),
80+
])
81+
->columns(1)
82+
->columnSpan([
83+
'default' => 2,
84+
'md' => 1,
85+
]),
86+
]),
87+
Forms\Components\Textarea::make('data')
88+
->rows(10)
89+
->columnSpan(2),
90+
]);
91+
}
92+
2493
public static function table(Table $table): Table
2594
{
2695
$settings = new GeneralSettings();
@@ -29,59 +98,78 @@ public static function table(Table $table): Table
2998
->columns([
3099
TextColumn::make('id')
31100
->label('ID'),
101+
TextColumn::make('server')
102+
->getStateUsing(fn (Result $record): string|null => ! blank($record->server_id) ? $record->server_id.' ('.$record->server_name.')' : null)
103+
->toggleable(),
104+
IconColumn::make('successful')
105+
->boolean()
106+
->toggleable(),
32107
IconColumn::make('scheduled')
33108
->boolean()
34-
->toggleable()
35-
->toggledHiddenByDefault(),
36-
ViewColumn::make('download')
37-
->view('tables.columns.bits-column'),
38-
ViewColumn::make('upload')
39-
->view('tables.columns.bits-column'),
109+
->toggleable(),
110+
TextColumn::make('download')
111+
->label('Download (Mbps)')
112+
->getStateUsing(fn (Result $record): string|null => ! blank($record->download) ? formatBits(formatBytestoBits($record->download), 3, false) : null),
113+
TextColumn::make('upload')
114+
->label('Upload (Mbps)')
115+
->getStateUsing(fn (Result $record): string|null => ! blank($record->upload) ? formatBits(formatBytestoBits($record->upload), 3, false) : null),
40116
TextColumn::make('ping')
117+
->label('Ping (Ms)')
41118
->toggleable(),
42119
TextColumn::make('download_jitter')
43-
->getStateUsing(function (Result $record): string|null {
44-
return json_decode($record->data, true)['download']['latency']['jitter'] ?? null;
45-
})
120+
->getStateUsing(fn (Result $record): string|null => json_decode($record->data, true)['download']['latency']['jitter'] ?? null)
46121
->toggleable()
47122
->toggledHiddenByDefault(),
48123
TextColumn::make('upload_jitter')
49-
->getStateUsing(function (Result $record): string|null {
50-
return json_decode($record->data, true)['upload']['latency']['jitter'] ?? null;
51-
})
124+
->getStateUsing(fn (Result $record): string|null => json_decode($record->data, true)['upload']['latency']['jitter'] ?? null)
52125
->toggleable()
53126
->toggledHiddenByDefault(),
54127
TextColumn::make('ping_jitter')
55-
->getStateUsing(function (Result $record): string|null {
56-
return json_decode($record->data, true)['ping']['jitter'] ?? null;
57-
})
128+
->getStateUsing(fn (Result $record): string|null => json_decode($record->data, true)['ping']['jitter'] ?? null)
58129
->toggleable()
59130
->toggledHiddenByDefault(),
60-
ViewColumn::make('server_id')
61-
->label('Server ID')
62-
->view('tables.columns.server-column')
63-
->toggleable(),
64131
TextColumn::make('created_at')
132+
->label('Created')
65133
->dateTime($settings->time_format ?? 'M j, Y G:i:s')
66-
->timezone($settings->timezone ?? 'UTC'),
134+
->timezone($settings->timezone ?? 'UTC')
135+
->sortable(),
67136
])
68137
->filters([
69-
//
138+
Tables\Filters\TernaryFilter::make('scheduled')
139+
->placeholder('-')
140+
->trueLabel('Only scheduled speedtests')
141+
->falseLabel('Only manual speedtests')
142+
->queries(
143+
true: fn (Builder $query) => $query->where('scheduled', true),
144+
false: fn (Builder $query) => $query->where('scheduled', false),
145+
blank: fn (Builder $query) => $query,
146+
),
147+
Tables\Filters\TernaryFilter::make('successful')
148+
->placeholder('-')
149+
->trueLabel('Only successful speedtests')
150+
->falseLabel('Only failed speedtests')
151+
->queries(
152+
true: fn (Builder $query) => $query->where('successful', true),
153+
false: fn (Builder $query) => $query->where('successful', false),
154+
blank: fn (Builder $query) => $query,
155+
),
70156
])
71157
->actions([
72158
Tables\Actions\ActionGroup::make([
73159
Action::make('view result')
74160
->label('View on Speedtest.net')
75161
->icon('heroicon-o-link')
76-
->url(fn (Result $record): string => $record->url)
162+
->url(fn (Result $record): string|null => optional($record)->url)
163+
->hidden(fn (Result $record): bool => ! $record->is_successful)
77164
->openUrlInNewTab(),
78-
// Tables\Actions\ViewAction::make(),
165+
Tables\Actions\ViewAction::make(),
79166
Tables\Actions\DeleteAction::make(),
80167
]),
81168
])
82169
->bulkActions([
83170
Tables\Actions\DeleteBulkAction::make(),
84-
]);
171+
])
172+
->defaultSort('created_at', 'desc');
85173
}
86174

87175
public static function getRelations(): array

app/Filament/Resources/ResultResource/Pages/ListResults.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,11 @@
44

55
use App\Filament\Resources\ResultResource;
66
use Filament\Resources\Pages\ListRecords;
7-
use Illuminate\Database\Eloquent\Builder;
87

98
class ListResults extends ListRecords
109
{
1110
protected static string $resource = ResultResource::class;
1211

13-
protected function getTableQuery(): Builder
14-
{
15-
return parent::getTableQuery()->orderBy('id', 'desc');
16-
}
17-
1812
protected function getTablePollingInterval(): ?string
1913
{
2014
return '5s';

app/Filament/Widgets/RecentJitterChart.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected function getData(): array
4949
'datasets' => [
5050
[
5151
'label' => 'Download',
52-
'data' => $results->map(fn ($item) => $item->getJitterData()['download']),
52+
'data' => $results->map(fn ($item) => $item->getJitterData()['download'] ?? 0),
5353
'borderColor' => '#0ea5e9',
5454
'backgroundColor' => '#0ea5e9',
5555
'fill' => false,
@@ -58,7 +58,7 @@ protected function getData(): array
5858
],
5959
[
6060
'label' => 'Upload',
61-
'data' => $results->map(fn ($item) => $item->getJitterData()['upload']),
61+
'data' => $results->map(fn ($item) => $item->getJitterData()['upload'] ?? 0),
6262
'borderColor' => '#8b5cf6',
6363
'backgroundColor' => '#8b5cf6',
6464
'fill' => false,
@@ -67,7 +67,7 @@ protected function getData(): array
6767
],
6868
[
6969
'label' => 'Ping',
70-
'data' => $results->map(fn ($item) => $item->getJitterData()['ping']),
70+
'data' => $results->map(fn ($item) => $item->getJitterData()['ping'] ?? 0),
7171
'borderColor' => '#10b981',
7272
'backgroundColor' => '#10b981',
7373
'fill' => false,

app/Filament/Widgets/RecentPingChart.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected function getData(): array
4949
'datasets' => [
5050
[
5151
'label' => 'Ping',
52-
'data' => $results->map(fn ($item) => $item->ping),
52+
'data' => $results->map(fn ($item) => $item->ping ?? 0),
5353
'borderColor' => '#10b981',
5454
'backgroundColor' => '#10b981',
5555
'fill' => false,

0 commit comments

Comments
 (0)