[Feature] Filament v3 (#736)
@@ -5,6 +5,9 @@ APP_DEBUG=false
|
||||
APP_URL=http://localhost
|
||||
|
||||
FORCE_HTTPS=false
|
||||
|
||||
CONTENT_WIDTH=7xl
|
||||
|
||||
DASHBOARD_POLLING=60
|
||||
NOTIFICATION_POLLING=60
|
||||
RESULTS_POLLING=false
|
||||
|
||||
|
After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 623 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 157 KiB |
@@ -1,5 +1,4 @@
|
||||
/node_modules
|
||||
/public/build
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
|
||||
@@ -17,9 +17,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -148,8 +154,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -172,6 +186,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -195,7 +210,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -237,9 +251,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -368,8 +388,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -392,6 +420,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -415,7 +444,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -457,9 +485,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -588,8 +622,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -612,6 +654,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -635,7 +678,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -677,9 +719,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -808,8 +856,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -832,6 +888,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -855,7 +912,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -897,9 +953,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -1028,8 +1090,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -1052,6 +1122,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -1075,7 +1146,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -1117,9 +1187,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -1248,8 +1324,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -1272,6 +1356,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -1295,7 +1380,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -1337,9 +1421,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -1468,8 +1558,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -1492,6 +1590,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -1515,7 +1614,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -1557,9 +1655,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -1688,8 +1792,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -1712,6 +1824,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -1735,7 +1848,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -1777,9 +1889,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -1908,8 +2026,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -1932,6 +2058,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -1955,7 +2082,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -1997,9 +2123,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -2128,8 +2260,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -2152,6 +2292,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -2175,7 +2316,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
@@ -2217,9 +2357,15 @@ namespace PHPSTORM_META {
|
||||
'App\Settings\ThresholdSettings' => \App\Settings\ThresholdSettings::class,
|
||||
'BladeUI\Icons\Factory' => \BladeUI\Icons\Factory::class,
|
||||
'BladeUI\Icons\IconsManifest' => \BladeUI\Icons\IconsManifest::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\EmailVerificationResponse' => \Filament\Http\Responses\Auth\EmailVerificationResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LoginResponse' => \Filament\Http\Responses\Auth\LoginResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\LogoutResponse' => \Filament\Http\Responses\Auth\LogoutResponse::class,
|
||||
'HtmlSanitizer\SanitizerInterface' => \HtmlSanitizer\Sanitizer::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\PasswordResetResponse' => \Filament\Http\Responses\Auth\PasswordResetResponse::class,
|
||||
'Filament\Http\Responses\Auth\Contracts\RegistrationResponse' => \Filament\Http\Responses\Auth\RegistrationResponse::class,
|
||||
'Filament\Support\Assets\AssetManager' => \Filament\Support\Assets\AssetManager::class,
|
||||
'Filament\Support\Colors\ColorManager' => \Filament\Support\Colors\ColorManager::class,
|
||||
'Filament\Support\Icons\IconManager' => \Filament\Support\Icons\IconManager::class,
|
||||
'Filament\Support\View\ViewManager' => \Filament\Support\View\ViewManager::class,
|
||||
'Illuminate\Auth\Console\ClearResetsCommand' => \Illuminate\Auth\Console\ClearResetsCommand::class,
|
||||
'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class,
|
||||
@@ -2348,8 +2494,16 @@ namespace PHPSTORM_META {
|
||||
'Illuminate\Session\Console\SessionTableCommand' => \Illuminate\Session\Console\SessionTableCommand::class,
|
||||
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
|
||||
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
|
||||
'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class,
|
||||
'Livewire\EventBus' => \Livewire\EventBus::class,
|
||||
'Livewire\LivewireManager' => \Livewire\LivewireManager::class,
|
||||
'Livewire\Mechanisms\ComponentRegistry' => \Livewire\Mechanisms\ComponentRegistry::class,
|
||||
'Livewire\Mechanisms\DataStore' => \Livewire\Mechanisms\DataStore::class,
|
||||
'Livewire\Mechanisms\ExtendBlade\ExtendBlade' => \Livewire\Mechanisms\ExtendBlade\ExtendBlade::class,
|
||||
'Livewire\Mechanisms\FrontendAssets\FrontendAssets' => \Livewire\Mechanisms\FrontendAssets\FrontendAssets::class,
|
||||
'Livewire\Mechanisms\HandleComponents\HandleComponents' => \Livewire\Mechanisms\HandleComponents\HandleComponents::class,
|
||||
'Livewire\Mechanisms\HandleRequests\HandleRequests' => \Livewire\Mechanisms\HandleRequests\HandleRequests::class,
|
||||
'Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware' => \Livewire\Mechanisms\PersistentMiddleware\PersistentMiddleware::class,
|
||||
'Livewire\Mechanisms\RenderComponent' => \Livewire\Mechanisms\RenderComponent::class,
|
||||
'Maatwebsite\Excel\Cache\CacheManager' => \Maatwebsite\Excel\Cache\CacheManager::class,
|
||||
'Maatwebsite\Excel\Files\Filesystem' => \Maatwebsite\Excel\Files\Filesystem::class,
|
||||
'Maatwebsite\Excel\Files\TemporaryFileFactory' => \Maatwebsite\Excel\Files\TemporaryFileFactory::class,
|
||||
@@ -2372,6 +2526,7 @@ namespace PHPSTORM_META {
|
||||
'Spatie\LaravelSettings\SettingsRepositories\SettingsRepository' => \Spatie\LaravelSettings\SettingsRepositories\DatabaseSettingsRepository::class,
|
||||
'Spatie\LaravelSettings\Support\SettingsCacheFactory' => \Spatie\LaravelSettings\Support\SettingsCacheFactory::class,
|
||||
'Squire\RepositoryManager' => \Squire\RepositoryManager::class,
|
||||
'Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface' => \Symfony\Component\HtmlSanitizer\HtmlSanitizer::class,
|
||||
'auth' => \Illuminate\Auth\AuthManager::class,
|
||||
'auth.driver' => \Illuminate\Auth\SessionGuard::class,
|
||||
'auth.password' => \Illuminate\Auth\Passwords\PasswordBrokerManager::class,
|
||||
@@ -2395,7 +2550,6 @@ namespace PHPSTORM_META {
|
||||
'events' => \Illuminate\Events\Dispatcher::class,
|
||||
'excel' => \Maatwebsite\Excel\Excel::class,
|
||||
'filament' => \Filament\FilamentManager::class,
|
||||
'filament-versions-manager' => \FilamentVersions\FilamentVersionsManager::class,
|
||||
'files' => \Illuminate\Filesystem\Filesystem::class,
|
||||
'filesystem' => \Illuminate\Filesystem\FilesystemManager::class,
|
||||
'filesystem.cloud' => \Illuminate\Filesystem\FilesystemAdapter::class,
|
||||
|
||||
@@ -22,15 +22,15 @@ Speedtest Tracker is containerized so you can run it anywhere you run your Docke
|
||||
|
||||
## API
|
||||
|
||||
A robust API is planned for a later release but `v0.11.8` includes a legacy endpoint `/api/speedtest/latest` which is used by home lab dashboards like [Homepage](https://github.com/benphelps/homepage) and [Organizr](https://github.com/causefx/Organizr/tree/v2-master).
|
||||
A robust API is planned for a later release but as of `v0.11.8` a legacy endpoint `/api/speedtest/latest` which is used by home lab dashboards like [Homepage](https://github.com/benphelps/homepage) and [Organizr](https://github.com/causefx/Organizr/tree/v2-master).
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
**Dashboard**
|
||||
|
||||

|
||||

|
||||
**Results page**
|
||||
|
||||

|
||||

|
||||
**General Settings page**
|
||||
|
||||
@@ -2,53 +2,28 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Filament\Widgets\RecentJitterChart;
|
||||
use App\Filament\Widgets\RecentPingChart;
|
||||
use App\Filament\Widgets\RecentSpeedChart;
|
||||
use App\Filament\Widgets\StatsOverview;
|
||||
use App\Filament\Widgets\RecentJitterChartWidget;
|
||||
use App\Filament\Widgets\RecentPingChartWidget;
|
||||
use App\Filament\Widgets\RecentSpeedChartWidget;
|
||||
use App\Filament\Widgets\StatsOverviewWidget;
|
||||
use App\Jobs\ExecSpeedtest;
|
||||
use App\Models\Result;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Notifications\Notification;
|
||||
use Filament\Pages\Actions\Action;
|
||||
use Filament\Pages\Dashboard as BasePage;
|
||||
use Illuminate\Contracts\View\View;
|
||||
|
||||
class Dashboard extends BasePage
|
||||
{
|
||||
public string $lastResult = 'never';
|
||||
|
||||
public int $resultsCount;
|
||||
protected static ?string $pollingInterval = null;
|
||||
|
||||
protected static string $view = 'filament.pages.dashboard';
|
||||
|
||||
public function render(): View
|
||||
protected function getPollingInterval(): ?string
|
||||
{
|
||||
$this->resultsCount = Result::count();
|
||||
|
||||
if ($this->resultsCount) {
|
||||
$result = Result::latest()
|
||||
->first();
|
||||
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
$this->lastResult = $result->created_at
|
||||
->timezone($settings->timezone)
|
||||
->format($settings->time_format);
|
||||
}
|
||||
|
||||
return view(static::$view, $this->getViewData())
|
||||
->layout(static::$layout, $this->getLayoutData());
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getActions(): array
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Action::make('speedtest')
|
||||
@@ -57,23 +32,13 @@ class Dashboard extends BasePage
|
||||
];
|
||||
}
|
||||
|
||||
public function getHeaderWidgets(): array
|
||||
protected function getHeaderWidgets(): array
|
||||
{
|
||||
return [
|
||||
StatsOverview::class,
|
||||
];
|
||||
}
|
||||
|
||||
public function getFooterWidgets(): array
|
||||
{
|
||||
if (! $this->resultsCount) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [
|
||||
RecentSpeedChart::class,
|
||||
RecentPingChart::class,
|
||||
RecentJitterChart::class,
|
||||
StatsOverviewWidget::make(),
|
||||
RecentSpeedChartWidget::make(),
|
||||
RecentPingChartWidget::make(),
|
||||
RecentJitterChartWidget::make(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Jobs\DeleteResultsData;
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Notifications\Notification;
|
||||
use Filament\Pages\Actions\Action;
|
||||
use Filament\Pages\Page;
|
||||
|
||||
class DeleteData extends Page
|
||||
@@ -21,7 +21,7 @@ class DeleteData extends Page
|
||||
|
||||
protected ?string $maxContentWidth = '3xl';
|
||||
|
||||
public function getActions(): array
|
||||
public function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Action::make('delete')
|
||||
@@ -30,9 +30,8 @@ class DeleteData extends Page
|
||||
->action(fn () => $this->deleteData())
|
||||
->requiresConfirmation()
|
||||
->modalHeading('Confirmation')
|
||||
->modalSubheading('Are you really-really-really sure you want to do this?')
|
||||
->modalContent(view('filament.pages.modals.delete-results-data-confirmation'))
|
||||
->modalButton('Yes, I\'m sure'),
|
||||
->modalDescription('This will delete all results data from the database, this cannot be undone. You have been warned!')
|
||||
->modalSubmitActionLabel('Yes, I am sure'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -41,7 +40,7 @@ class DeleteData extends Page
|
||||
DeleteResultsData::dispatch();
|
||||
|
||||
Notification::make()
|
||||
->title('Deleting speedtest results data')
|
||||
->title('Deleting results data')
|
||||
->body('The job has been added to the queue and will be completed shortly.')
|
||||
->warning()
|
||||
->send();
|
||||
|
||||
@@ -4,10 +4,8 @@ namespace App\Filament\Pages\Settings;
|
||||
|
||||
use App\Rules\Cron;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Pages\SettingsPage;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Squire\Models\Timezone;
|
||||
@@ -26,134 +24,102 @@ class GeneralPage extends SettingsPage
|
||||
|
||||
protected static string $settings = GeneralSettings::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
public function form(Form $form): Form
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Section::make('Site Settings')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('site_name')
|
||||
->maxLength(50)
|
||||
->required()
|
||||
->columnSpan(['md' => 2]),
|
||||
Forms\Components\Select::make('timezone')
|
||||
->label('Time zone')
|
||||
->options(Timezone::all()->pluck('code', 'code'))
|
||||
->searchable()
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('time_format')
|
||||
->helperText('Use [DateTime Format](https://www.php.net/manual/en/datetime.format.php) options to change the format of the datetime in views.')
|
||||
->placeholder('M j, Y G:i:s')
|
||||
->maxLength(25)
|
||||
->required(),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
return $settings->content_width;
|
||||
Forms\Components\Section::make('Speedtest Settings')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('speedtest_schedule')
|
||||
->rules([new Cron()])
|
||||
->helperText('Leave empty to disable the schedule. You can also use the cron expression generator [HERE](https://crontab.cronhub.io/) to help you make schedules.')
|
||||
->nullable()
|
||||
->columnSpan(1),
|
||||
Forms\Components\Select::make('speedtest_server')
|
||||
->label('Speedtest servers')
|
||||
->helperText('Leave empty to let the system pick the best server.')
|
||||
->nullable()
|
||||
->multiple()
|
||||
->maxItems(10)
|
||||
->preload()
|
||||
->searchable()
|
||||
->getSearchResultsUsing(fn (string $search): array => $this->getServerSearchOptions($search))
|
||||
->getOptionLabelsUsing(fn (array $values): array => $this->getServerLabels($values))
|
||||
->columnSpan('full'),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan('full'),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function getFormSchema(): array
|
||||
protected function getServerLabels(array $values): array
|
||||
{
|
||||
return [
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Section::make('Site Settings')
|
||||
->schema([
|
||||
TextInput::make('site_name')
|
||||
->maxLength(50)
|
||||
->required()
|
||||
->columnSpan(['md' => 2]),
|
||||
Select::make('timezone')
|
||||
->options(Timezone::all()->pluck('code', 'code'))
|
||||
->searchable()
|
||||
->required(),
|
||||
TextInput::make('time_format')
|
||||
->helperText('Use [DateTime Format](https://www.php.net/manual/en/datetime.format.php) options to change the format of the datetime in views.')
|
||||
->placeholder('M j, Y G:i:s')
|
||||
->maxLength(25)
|
||||
->required(),
|
||||
Select::make('content_width')
|
||||
->options([
|
||||
'7xl' => 'Default width',
|
||||
'full' => 'Full width',
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
return collect($values)->mapWithKeys(function (string $item, int $key) {
|
||||
return [$item => $item];
|
||||
})->toArray();
|
||||
}
|
||||
|
||||
Section::make('Speedtest Settings')
|
||||
->schema([
|
||||
TextInput::make('speedtest_schedule')
|
||||
->rules([new Cron()])
|
||||
->helperText('Leave empty to disable the schedule. You can also use the cron expression generator [HERE](https://crontab.cronhub.io/) to help you make schedules.')
|
||||
->nullable()
|
||||
->columnSpan(1),
|
||||
Select::make('speedtest_server')
|
||||
->label('Speedtest server ID')
|
||||
->helperText('Leave empty to let the system pick the best server.')
|
||||
->nullable()
|
||||
->multiple()
|
||||
->maxItems(10)
|
||||
->searchable()
|
||||
->options(function () {
|
||||
$response = Http::get(
|
||||
url: 'https://www.speedtest.net/api/js/servers',
|
||||
query: [
|
||||
'engine' => 'js',
|
||||
'https_functional' => true,
|
||||
'limit' => 10,
|
||||
]
|
||||
);
|
||||
protected function getServerSearchOptions(string $search): array
|
||||
{
|
||||
$response = Http::get(
|
||||
url: 'https://www.speedtest.net/api/js/servers',
|
||||
query: [
|
||||
'engine' => 'js',
|
||||
'search' => $search,
|
||||
'https_functional' => true,
|
||||
'limit' => 10,
|
||||
]
|
||||
);
|
||||
|
||||
if ($response->failed()) {
|
||||
return [
|
||||
'' => 'There was an error retrieving Speedtest servers',
|
||||
];
|
||||
}
|
||||
if ($response->failed()) {
|
||||
return [
|
||||
'' => 'There was an error retrieving Speedtest servers',
|
||||
];
|
||||
}
|
||||
|
||||
return $response->collect()->map(function ($item) {
|
||||
return [
|
||||
'id' => $item['id'],
|
||||
'name' => $item['id'].': '.$item['name'].' ('.$item['sponsor'].')',
|
||||
];
|
||||
})->pluck('name', 'id');
|
||||
})
|
||||
->getSearchResultsUsing(function (string $search) {
|
||||
$response = Http::get(
|
||||
url: 'https://www.speedtest.net/api/js/servers',
|
||||
query: [
|
||||
'engine' => 'js',
|
||||
'search' => $search,
|
||||
'https_functional' => true,
|
||||
'limit' => 10,
|
||||
]
|
||||
);
|
||||
if (! $response->collect()->count() && is_numeric($search)) {
|
||||
return collect([
|
||||
[
|
||||
'id' => $search,
|
||||
'name' => 'Unknown server',
|
||||
],
|
||||
])->pluck('name', 'id')->toArray();
|
||||
}
|
||||
|
||||
if ($response->failed()) {
|
||||
return [
|
||||
'' => 'There was an error retrieving Speedtest servers',
|
||||
];
|
||||
}
|
||||
|
||||
if (! $response->collect()->count() && is_numeric($search)) {
|
||||
return collect([
|
||||
[
|
||||
'id' => $search,
|
||||
'name' => $search.': No server found, manually add this ID.',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
return $response->collect()->map(function ($item) {
|
||||
return [
|
||||
'id' => $item['id'],
|
||||
'name' => $item['id'].': '.$item['name'].' ('.$item['sponsor'].')',
|
||||
];
|
||||
})->pluck('name', 'id');
|
||||
})
|
||||
->columnSpan(2),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
]),
|
||||
];
|
||||
return $response->collect()->mapWithKeys(function (array $item, int $key) {
|
||||
return [$item['id'] => $item['id'].': '.$item['name'].' ('.$item['sponsor'].')'];
|
||||
})->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,19 +2,14 @@
|
||||
|
||||
namespace App\Filament\Pages\Settings;
|
||||
|
||||
use App\Settings\GeneralSettings;
|
||||
use App\Settings\InfluxDbSettings;
|
||||
use Closure;
|
||||
use Filament\Forms\Components\Checkbox;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Pages\SettingsPage;
|
||||
|
||||
class InfluxDbPage extends SettingsPage
|
||||
{
|
||||
protected static ?string $navigationIcon = 'heroicon-o-database';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-circle-stack';
|
||||
|
||||
protected static ?string $navigationGroup = 'Settings';
|
||||
|
||||
@@ -26,75 +21,62 @@ class InfluxDbPage extends SettingsPage
|
||||
|
||||
protected static string $settings = InfluxDbSettings::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
public function form(Form $form): Form
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getFormSchema(): array
|
||||
{
|
||||
return [
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Section::make('InfluxDB v2 Settings')
|
||||
->schema([
|
||||
Toggle::make('v2_enabled')
|
||||
->label('Enable')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('v2_enabled') !== true)
|
||||
->schema([
|
||||
TextInput::make('v2_url')
|
||||
->label('URL')
|
||||
->placeholder('http://your-influxdb-instance')
|
||||
->maxLength(255)
|
||||
->required(fn (Closure $get) => $get('v2_enabled') == true)
|
||||
->columnSpan(['md' => 2]),
|
||||
Checkbox::make('v2_verify_ssl')
|
||||
->label('Verify SSL')
|
||||
->columnSpan(['md' => 2]),
|
||||
TextInput::make('v2_org')
|
||||
->label('Org')
|
||||
->maxLength(255)
|
||||
->required(fn (Closure $get) => $get('v2_enabled') == true)
|
||||
->columnSpan(1),
|
||||
TextInput::make('v2_bucket')
|
||||
->placeholder('speedtest-tracker')
|
||||
->label('Bucket')
|
||||
->maxLength(255)
|
||||
->required(fn (Closure $get) => $get('v2_enabled') == true)
|
||||
->columnSpan(1),
|
||||
TextInput::make('v2_token')
|
||||
->label('Token')
|
||||
->maxLength(255)
|
||||
->password()
|
||||
->required(fn (Closure $get) => $get('v2_enabled') == true)
|
||||
->disableAutocomplete()
|
||||
->columnSpan(['md' => 2]),
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Section::make('InfluxDB v2 Settings')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('v2_enabled')
|
||||
->label('Enable')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
]),
|
||||
];
|
||||
'md' => 3,
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('v2_enabled') !== true)
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('v2_url')
|
||||
->label('URL')
|
||||
->placeholder('http://your-influxdb-instance')
|
||||
->maxLength(255)
|
||||
->required(fn (Forms\Get $get) => $get('v2_enabled') == true)
|
||||
->columnSpanFull(),
|
||||
Forms\Components\Checkbox::make('v2_verify_ssl')
|
||||
->label('Verify SSL')
|
||||
->columnSpanFull(),
|
||||
Forms\Components\TextInput::make('v2_org')
|
||||
->label('Org')
|
||||
->maxLength(255)
|
||||
->required(fn (Forms\Get $get) => $get('v2_enabled') == true)
|
||||
->columnSpan(['md' => 2]),
|
||||
Forms\Components\TextInput::make('v2_bucket')
|
||||
->placeholder('speedtest-tracker')
|
||||
->label('Bucket')
|
||||
->maxLength(255)
|
||||
->required(fn (Forms\Get $get) => $get('v2_enabled') == true)
|
||||
->columnSpan(['md' => 1]),
|
||||
Forms\Components\TextInput::make('v2_token')
|
||||
->label('Token')
|
||||
->maxLength(255)
|
||||
->password()
|
||||
->required(fn (Forms\Get $get) => $get('v2_enabled') == true)
|
||||
->disableAutocomplete()
|
||||
->columnSpanFull(),
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan('full'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,17 +7,9 @@ use App\Forms\Components\TestMailNotification;
|
||||
use App\Forms\Components\TestTelegramNotification;
|
||||
use App\Mail\Test;
|
||||
use App\Notifications\Telegram\TestNotification as TelegramTestNotification;
|
||||
use App\Settings\GeneralSettings;
|
||||
use App\Settings\NotificationSettings;
|
||||
use Closure;
|
||||
use Filament\Forms\Components\Card;
|
||||
use Filament\Forms\Components\Fieldset;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Repeater;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Forms\Components\View;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Notifications\Notification;
|
||||
use Filament\Pages\SettingsPage;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
@@ -37,147 +29,141 @@ class NotificationPage extends SettingsPage
|
||||
|
||||
protected static string $settings = NotificationSettings::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
public function form(Form $form): Form
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getFormSchema(): array
|
||||
{
|
||||
return [
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Section::make('Database')
|
||||
->description('Notifications sent to this channel will show up under the 🔔 icon in the header.')
|
||||
->schema([
|
||||
Toggle::make('database_enabled')
|
||||
->label('Enable database notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('database_enabled') !== true)
|
||||
->schema([
|
||||
Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Toggle::make('database_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Toggle::make('database_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
TestDatabaseNotification::make('test channel'),
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Section::make('Mail')
|
||||
->schema([
|
||||
Toggle::make('mail_enabled')
|
||||
->label('Enable mail notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Toggle::make('mail_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Toggle::make('mail_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('mail_enabled') !== true),
|
||||
|
||||
Repeater::make('mail_recipients')
|
||||
->label('Recipients')
|
||||
->schema([
|
||||
TextInput::make('email_address')
|
||||
->email()
|
||||
->required(),
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('mail_enabled') !== true)
|
||||
->columnSpan(['md' => 2]),
|
||||
TestMailNotification::make('test channel')
|
||||
->hidden(fn (Closure $get) => $get('mail_enabled') !== true),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Section::make('Telegram')
|
||||
->schema([
|
||||
Toggle::make('telegram_enabled')
|
||||
->label('Enable telegram notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Grid::make([
|
||||
'default' => 1, ])
|
||||
->hidden(fn (Closure $get) => $get('telegram_enabled') !== true)
|
||||
->schema([
|
||||
Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Toggle::make('telegram_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Toggle::make('telegram_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
]),
|
||||
Repeater::make('telegram_recipients')
|
||||
->label('Recipients')
|
||||
->schema([
|
||||
TextInput::make('telegram_chat_id')
|
||||
->maxLength(50)
|
||||
->required()
|
||||
->columnSpan(['md' => 2]),
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('telegram_enabled') !== true)
|
||||
->columnSpan(['md' => 2]),
|
||||
TestTelegramNotification::make('test channel')
|
||||
->hidden(fn (Closure $get) => $get('telegram_enabled') !== true),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
->schema([
|
||||
Forms\Components\Section::make('Database')
|
||||
->description('Notifications sent to this channel will show up under the 🔔 icon in the header.')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('database_enabled')
|
||||
->label('Enable database notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('database_enabled') !== true)
|
||||
->schema([
|
||||
Forms\Components\Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('database_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Forms\Components\Toggle::make('database_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
TestDatabaseNotification::make('test channel'),
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Card::make()
|
||||
->schema([
|
||||
View::make('filament.forms.notifications-helptext'),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 1,
|
||||
]),
|
||||
]),
|
||||
];
|
||||
Forms\Components\Section::make('Mail')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('mail_enabled')
|
||||
->label('Enable mail notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('mail_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Forms\Components\Toggle::make('mail_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('mail_enabled') !== true),
|
||||
|
||||
Forms\Components\Repeater::make('mail_recipients')
|
||||
->label('Recipients')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('email_address')
|
||||
->email()
|
||||
->required(),
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('mail_enabled') !== true)
|
||||
->columnSpan(['md' => 2]),
|
||||
TestMailNotification::make('test channel')
|
||||
->hidden(fn (Forms\Get $get) => $get('mail_enabled') !== true),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Forms\Components\Section::make('Telegram')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('telegram_enabled')
|
||||
->label('Enable telegram notifications')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1, ])
|
||||
->hidden(fn (Forms\Get $get) => $get('telegram_enabled') !== true)
|
||||
->schema([
|
||||
Forms\Components\Fieldset::make('Triggers')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('telegram_on_speedtest_run')
|
||||
->label('Notify on every speedtest run')
|
||||
->columnSpan(2),
|
||||
Forms\Components\Toggle::make('telegram_on_threshold_failure')
|
||||
->label('Notify on threshold failures')
|
||||
->columnSpan(2),
|
||||
]),
|
||||
]),
|
||||
Forms\Components\Repeater::make('telegram_recipients')
|
||||
->label('Recipients')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('telegram_chat_id')
|
||||
->maxLength(50)
|
||||
->required()
|
||||
->columnSpan(['md' => 2]),
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('telegram_enabled') !== true)
|
||||
->columnSpan(['md' => 2]),
|
||||
TestTelegramNotification::make('test channel')
|
||||
->hidden(fn (Forms\Get $get) => $get('telegram_enabled') !== true),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Forms\Components\Section::make()
|
||||
->schema([
|
||||
Forms\Components\View::make('filament.forms.notifications-helptext'),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 1,
|
||||
]),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function sendTestDatabaseNotification(): void
|
||||
|
||||
@@ -2,21 +2,14 @@
|
||||
|
||||
namespace App\Filament\Pages\Settings;
|
||||
|
||||
use App\Settings\GeneralSettings;
|
||||
use App\Settings\ThresholdSettings;
|
||||
use Closure;
|
||||
use Filament\Forms\Components\Card;
|
||||
use Filament\Forms\Components\Fieldset;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Forms\Components\View;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Pages\SettingsPage;
|
||||
|
||||
class ThresholdsPage extends SettingsPage
|
||||
{
|
||||
protected static ?string $navigationIcon = 'heroicon-o-exclamation';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-exclamation-triangle';
|
||||
|
||||
protected static ?string $navigationGroup = 'Settings';
|
||||
|
||||
@@ -28,88 +21,82 @@ class ThresholdsPage extends SettingsPage
|
||||
|
||||
protected static string $settings = ThresholdSettings::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
public function form(Form $form): Form
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getFormSchema(): array
|
||||
{
|
||||
return [
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Section::make('Absolute')
|
||||
->description('Absolute thresholds do not take into account previous history and could be triggered on each test.')
|
||||
->schema([
|
||||
Toggle::make('absolute_enabled')
|
||||
->label('Enable absolute thresholds')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Grid::make([
|
||||
'default' => 1,
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Section::make('Absolute')
|
||||
->description('Absolute thresholds do not take into account previous history and could be triggered on each test.')
|
||||
->schema([
|
||||
Forms\Components\Toggle::make('absolute_enabled')
|
||||
->label('Enable absolute thresholds')
|
||||
->reactive()
|
||||
->columnSpan(2),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
])
|
||||
->hidden(fn (Forms\Get $get) => $get('absolute_enabled') !== true)
|
||||
->schema([
|
||||
Forms\Components\Fieldset::make('Metrics')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('absolute_download')
|
||||
->label('Download')
|
||||
->hint('Mbps')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('absolute_upload')
|
||||
->label('Upload')
|
||||
->hint('Mbps')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('absolute_ping')
|
||||
->label('Ping')
|
||||
->hint('Ms')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
])
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
]),
|
||||
])
|
||||
->hidden(fn (Closure $get) => $get('absolute_enabled') !== true)
|
||||
->schema([
|
||||
Fieldset::make('Metrics')
|
||||
->schema([
|
||||
TextInput::make('absolute_download')
|
||||
->label('Download')
|
||||
->hint('Mbps')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
TextInput::make('absolute_upload')
|
||||
->label('Upload')
|
||||
->hint('Mbps')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
TextInput::make('absolute_ping')
|
||||
->label('Ping')
|
||||
->hint('Ms')
|
||||
->helperText('Set to zero to disable this metric.')
|
||||
->default(0)
|
||||
->minValue(0)
|
||||
->numeric()
|
||||
->required(),
|
||||
])
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
]),
|
||||
])
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
->compact()
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'md' => 2,
|
||||
]),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Card::make()
|
||||
->schema([
|
||||
View::make('filament.forms.thresholds-helptext'),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 1,
|
||||
]),
|
||||
]),
|
||||
];
|
||||
Forms\Components\Section::make()
|
||||
->schema([
|
||||
Forms\Components\View::make('filament.forms.thresholds-helptext'),
|
||||
])
|
||||
->columnSpan([
|
||||
'md' => 1,
|
||||
]),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,13 +9,13 @@ use App\Settings\GeneralSettings;
|
||||
use Carbon\Carbon;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Resources\Form;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Resources\Table;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Actions\Action;
|
||||
use Filament\Tables\Columns\IconColumn;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
@@ -24,7 +24,7 @@ class ResultResource extends Resource
|
||||
{
|
||||
protected static ?string $model = Result::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-table';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-table-cells';
|
||||
|
||||
protected static ?string $navigationLabel = 'Results';
|
||||
|
||||
@@ -76,7 +76,7 @@ class ResultResource extends Resource
|
||||
->label('Ping (Ms)'),
|
||||
])
|
||||
->columnSpan(2),
|
||||
Forms\Components\Card::make()
|
||||
Forms\Components\Section::make()
|
||||
->schema([
|
||||
Forms\Components\Checkbox::make('successful'),
|
||||
Forms\Components\Checkbox::make('scheduled'),
|
||||
@@ -167,7 +167,7 @@ class ResultResource extends Resource
|
||||
->openUrlInNewTab(),
|
||||
Tables\Actions\ViewAction::make(),
|
||||
Tables\Actions\Action::make('updateComments')
|
||||
->icon('heroicon-o-annotation')
|
||||
->icon('heroicon-o-chat-bubble-bottom-center-text')
|
||||
->mountUsing(fn (Forms\ComponentContainer $form, Result $record) => $form->fill([
|
||||
'comments' => $record->comments,
|
||||
]))
|
||||
@@ -187,7 +187,7 @@ class ResultResource extends Resource
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkAction::make('export')
|
||||
->label('Export selected')
|
||||
->icon('heroicon-o-download')
|
||||
->icon('heroicon-o-arrow-down-tray')
|
||||
->action(function (Collection $records) {
|
||||
$export = new ResultsSelectedBulkExport($records->toArray());
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Filament\Resources\ResultResource\Pages;
|
||||
|
||||
use App\Filament\Resources\ResultResource;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class ListResults extends ListRecords
|
||||
@@ -15,13 +14,6 @@ class ListResults extends ListRecords
|
||||
return config('speedtest.results_polling');
|
||||
}
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getHeaderWidgets(): array
|
||||
{
|
||||
return ResultResource::getWidgets();
|
||||
|
||||
@@ -6,16 +6,11 @@ use App\Filament\Resources\UserResource\Pages;
|
||||
use App\Filament\Resources\UserResource\Pages\CreateUser;
|
||||
use App\Filament\Resources\UserResource\Pages\EditUser;
|
||||
use App\Models\User;
|
||||
use Filament\Forms\Components\Card;
|
||||
use Filament\Forms\Components\Group;
|
||||
use Filament\Forms\Components\Placeholder;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Resources\Form;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Resources\Table;
|
||||
use Filament\Tables\Actions\DeleteBulkAction;
|
||||
use Filament\Tables\Actions\EditAction;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\HtmlString;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
@@ -26,7 +21,7 @@ class UserResource extends Resource
|
||||
|
||||
protected static ?string $navigationGroup = 'System';
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-collection';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
|
||||
|
||||
protected static ?int $navigationSort = 0;
|
||||
|
||||
@@ -36,65 +31,84 @@ class UserResource extends Resource
|
||||
{
|
||||
return $form
|
||||
->schema([
|
||||
'left' => Card::make([
|
||||
'name' => TextInput::make('name')
|
||||
->required(),
|
||||
'email' => TextInput::make('email')
|
||||
->required()
|
||||
->email()
|
||||
->unique(ignoreRecord: true),
|
||||
'password' => TextInput::make('password')
|
||||
->required()
|
||||
->password()
|
||||
->dehydrateStateUsing(fn ($state) => Hash::make($state))
|
||||
->visible(fn ($livewire) => $livewire instanceof CreateUser)
|
||||
->rule(Password::default()),
|
||||
'new_password_group' => Group::make([
|
||||
'new_password' => TextInput::make('new_password')
|
||||
->password()
|
||||
->label('New Password')
|
||||
->nullable()
|
||||
->rule(Password::default())
|
||||
->visible(fn ($livewire) => $livewire instanceof EditUser)
|
||||
->dehydrated(false),
|
||||
'new_password_confirmation' => TextInput::make('new_password_confirmation')
|
||||
->password()
|
||||
->label('Confirm New Password')
|
||||
->rule('required', fn ($get) => (bool) $get('new_password'))
|
||||
->same('new_password')
|
||||
->visible(fn ($livewire) => $livewire instanceof EditUser)
|
||||
->dehydrated(false),
|
||||
Forms\Components\Grid::make([
|
||||
'default' => 1,
|
||||
'md' => 3,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Section::make()
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('name')
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('email')
|
||||
->required()
|
||||
->email()
|
||||
->unique(ignoreRecord: true),
|
||||
Forms\Components\TextInput::make('password')
|
||||
->required()
|
||||
->password()
|
||||
->dehydrateStateUsing(fn ($state) => Hash::make($state))
|
||||
->visible(fn ($livewire) => $livewire instanceof CreateUser)
|
||||
->rule(Password::default()),
|
||||
Forms\Components\TextInput::make('new_password')
|
||||
->password()
|
||||
->label('New Password')
|
||||
->nullable()
|
||||
->rule(Password::default())
|
||||
->visible(fn ($livewire) => $livewire instanceof EditUser)
|
||||
->dehydrated(false),
|
||||
Forms\Components\TextInput::make('new_password_confirmation')
|
||||
->password()
|
||||
->label('Confirm New Password')
|
||||
->rule('required', fn ($get) => (bool) $get('new_password'))
|
||||
->same('new_password')
|
||||
->visible(fn ($livewire) => $livewire instanceof EditUser)
|
||||
->dehydrated(false),
|
||||
])
|
||||
->columns('full')
|
||||
->columnSpan([
|
||||
'md' => 2,
|
||||
]),
|
||||
|
||||
Forms\Components\Section::make()
|
||||
->schema([
|
||||
Forms\Components\Placeholder::make('created_at')
|
||||
->content(fn ($record) => $record?->created_at?->diffForHumans() ?? new HtmlString('—')),
|
||||
Forms\Components\Placeholder::make('updated_at')
|
||||
->content(fn ($record) => $record?->updated_at?->diffForHumans() ?? new HtmlString('—')),
|
||||
])
|
||||
->columns('full')
|
||||
->columnSpan(1),
|
||||
]),
|
||||
])->columnSpan(8),
|
||||
'right' => Card::make([
|
||||
'created_at' => Placeholder::make('created_at')
|
||||
->content(fn ($record) => $record?->created_at?->diffForHumans() ?? new HtmlString('—')),
|
||||
])->columnSpan(4),
|
||||
])
|
||||
->columns(12);
|
||||
]);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
TextColumn::make('name'),
|
||||
TextColumn::make('email'),
|
||||
TextColumn::make('email_verified_at')
|
||||
Tables\Columns\TextColumn::make('name')
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('email')
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('email_verified_at')
|
||||
->dateTime(),
|
||||
TextColumn::make('created_at')
|
||||
Tables\Columns\TextColumn::make('created_at')
|
||||
->dateTime(),
|
||||
TextColumn::make('updated_at')
|
||||
Tables\Columns\TextColumn::make('updated_at')
|
||||
->dateTime(),
|
||||
])
|
||||
->filters([
|
||||
//
|
||||
])
|
||||
->actions([
|
||||
EditAction::make(),
|
||||
Tables\Actions\EditAction::make(),
|
||||
])
|
||||
->bulkActions([
|
||||
DeleteBulkAction::make(),
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
Tables\Actions\DeleteBulkAction::make()
|
||||
->requiresConfirmation(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,17 +3,9 @@
|
||||
namespace App\Filament\Resources\UserResource\Pages;
|
||||
|
||||
use App\Filament\Resources\UserResource;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
|
||||
class CreateUser extends CreateRecord
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
namespace App\Filament\Resources\UserResource\Pages;
|
||||
|
||||
use App\Filament\Resources\UserResource;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Pages\Actions;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
@@ -12,14 +11,7 @@ class EditUser extends EditRecord
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getActions(): array
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\DeleteAction::make(),
|
||||
|
||||
@@ -3,22 +3,14 @@
|
||||
namespace App\Filament\Resources\UserResource\Pages;
|
||||
|
||||
use App\Filament\Resources\UserResource;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Pages\Actions;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class ListUsers extends ListRecords
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
|
||||
protected function getMaxContentWidth(): string
|
||||
{
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
return $settings->content_width;
|
||||
}
|
||||
|
||||
protected function getActions(): array
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\CreateAction::make(),
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Awcodes\FilamentVersions\Providers\Contracts\VersionProvider;
|
||||
|
||||
class SpeedtestTrackerVersionProvider implements VersionProvider
|
||||
{
|
||||
public function getName(): string
|
||||
{
|
||||
return 'App';
|
||||
}
|
||||
|
||||
public function getVersion(): string
|
||||
{
|
||||
return app()->isProduction()
|
||||
? config('speedtest.build_version')
|
||||
: config('app.env');
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,12 @@ namespace App\Filament\Widgets;
|
||||
|
||||
use App\Models\Result;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Widgets\LineChartWidget;
|
||||
use Filament\Widgets\ChartWidget;
|
||||
|
||||
class RecentJitterChart extends LineChartWidget
|
||||
class RecentJitterChartWidget extends ChartWidget
|
||||
{
|
||||
protected static ?string $heading = 'Jitter';
|
||||
|
||||
protected int|string|array $columnSpan = 'full';
|
||||
|
||||
protected static ?string $maxHeight = '300px';
|
||||
@@ -19,11 +21,6 @@ class RecentJitterChart extends LineChartWidget
|
||||
return config('speedtest.dashboard_polling');
|
||||
}
|
||||
|
||||
protected function getHeading(): string
|
||||
{
|
||||
return 'Jitter';
|
||||
}
|
||||
|
||||
protected function getFilters(): ?array
|
||||
{
|
||||
return [
|
||||
@@ -83,4 +80,9 @@ class RecentJitterChart extends LineChartWidget
|
||||
'labels' => $results->map(fn ($item) => $item->created_at->timezone($settings->timezone)->format('M d - G:i')),
|
||||
];
|
||||
}
|
||||
|
||||
protected function getType(): string
|
||||
{
|
||||
return 'line';
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,12 @@ namespace App\Filament\Widgets;
|
||||
|
||||
use App\Models\Result;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Widgets\LineChartWidget;
|
||||
use Filament\Widgets\ChartWidget;
|
||||
|
||||
class RecentPingChart extends LineChartWidget
|
||||
class RecentPingChartWidget extends ChartWidget
|
||||
{
|
||||
protected static ?string $heading = 'Ping (ms)';
|
||||
|
||||
protected int|string|array $columnSpan = 'full';
|
||||
|
||||
protected static ?string $maxHeight = '300px';
|
||||
@@ -19,11 +21,6 @@ class RecentPingChart extends LineChartWidget
|
||||
return config('speedtest.dashboard_polling');
|
||||
}
|
||||
|
||||
protected function getHeading(): string
|
||||
{
|
||||
return 'Ping (ms)';
|
||||
}
|
||||
|
||||
protected function getFilters(): ?array
|
||||
{
|
||||
return [
|
||||
@@ -65,4 +62,9 @@ class RecentPingChart extends LineChartWidget
|
||||
'labels' => $results->map(fn ($item) => $item->created_at->timezone($settings->timezone)->format('M d - G:i')),
|
||||
];
|
||||
}
|
||||
|
||||
protected function getType(): string
|
||||
{
|
||||
return 'line';
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,12 @@ namespace App\Filament\Widgets;
|
||||
|
||||
use App\Models\Result;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Widgets\LineChartWidget;
|
||||
use Filament\Widgets\ChartWidget;
|
||||
|
||||
class RecentSpeedChart extends LineChartWidget
|
||||
class RecentSpeedChartWidget extends ChartWidget
|
||||
{
|
||||
protected static ?string $heading = 'Download / Upload';
|
||||
|
||||
protected int|string|array $columnSpan = 'full';
|
||||
|
||||
protected static ?string $maxHeight = '300px';
|
||||
@@ -19,11 +21,6 @@ class RecentSpeedChart extends LineChartWidget
|
||||
return config('speedtest.dashboard_polling');
|
||||
}
|
||||
|
||||
protected function getHeading(): string
|
||||
{
|
||||
return 'Download / Upload';
|
||||
}
|
||||
|
||||
protected function getFilters(): ?array
|
||||
{
|
||||
return [
|
||||
@@ -74,4 +71,9 @@ class RecentSpeedChart extends LineChartWidget
|
||||
'labels' => $results->map(fn ($item) => $item->created_at->timezone($settings->timezone)->format('M d - G:i')),
|
||||
];
|
||||
}
|
||||
|
||||
protected function getType(): string
|
||||
{
|
||||
return 'line';
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Widgets;
|
||||
|
||||
use App\Models\Result;
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
|
||||
use Filament\Widgets\StatsOverviewWidget\Card;
|
||||
|
||||
class StatsOverview extends BaseWidget
|
||||
{
|
||||
protected function getPollingInterval(): ?string
|
||||
{
|
||||
return config('speedtest.dashboard_polling');
|
||||
}
|
||||
|
||||
protected function getCards(): array
|
||||
{
|
||||
$result = Result::latest()->first();
|
||||
|
||||
$settings = new GeneralSettings();
|
||||
|
||||
if (! $result || ! $result->successful) {
|
||||
return [
|
||||
Card::make('Latest download', '-')
|
||||
->icon('heroicon-o-download'),
|
||||
Card::make('Latest upload', '-')
|
||||
->icon('heroicon-o-upload'),
|
||||
Card::make('Latest ping', '-')
|
||||
->icon('heroicon-o-clock'),
|
||||
];
|
||||
}
|
||||
|
||||
$previous = $result->previous();
|
||||
|
||||
if (! $previous || ! $previous->successful) {
|
||||
return [
|
||||
Card::make('Latest download', fn (): string => ! blank($result) ? toBits(convertSize($result->download), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-download'),
|
||||
Card::make('Latest upload', fn (): string => ! blank($result) ? toBits(convertSize($result->upload), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-upload'),
|
||||
Card::make('Latest ping', fn (): string => ! blank($result) ? number_format($result->ping, 2).' (ms)' : 'n/a')
|
||||
->icon('heroicon-o-clock'),
|
||||
];
|
||||
}
|
||||
|
||||
$downloadChange = percentChange($result->download, $previous->download, 2);
|
||||
$uploadChange = percentChange($result->upload, $previous->upload, 2);
|
||||
$pingChange = percentChange($result->ping, $previous->ping, 2);
|
||||
|
||||
return [
|
||||
Card::make('Latest download', fn (): string => ! blank($result) ? toBits(convertSize($result->download), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-download')
|
||||
->description($downloadChange > 0 ? $downloadChange.'% faster' : abs($downloadChange).'% slower')
|
||||
->descriptionIcon($downloadChange > 0 ? 'heroicon-s-trending-up' : 'heroicon-s-trending-down')
|
||||
->color($downloadChange > 0 ? 'success' : 'danger'),
|
||||
Card::make('Latest upload', fn (): string => ! blank($result) ? toBits(convertSize($result->upload), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-upload')
|
||||
->description($uploadChange > 0 ? $uploadChange.'% faster' : abs($uploadChange).'% slower')
|
||||
->descriptionIcon($uploadChange > 0 ? 'heroicon-s-trending-up' : 'heroicon-s-trending-down')
|
||||
->color($uploadChange > 0 ? 'success' : 'danger'),
|
||||
Card::make('Latest ping', fn (): string => ! blank($result) ? number_format($result->ping, 2).' (ms)' : 'n/a')
|
||||
->icon('heroicon-o-clock')
|
||||
->description($pingChange > 0 ? $pingChange.'% slower' : abs($pingChange).'% faster')
|
||||
->descriptionIcon($pingChange > 0 ? 'heroicon-s-trending-up' : 'heroicon-s-trending-down')
|
||||
->color($pingChange > 0 ? 'danger' : 'success'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Widgets;
|
||||
|
||||
use App\Models\Result;
|
||||
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
|
||||
use Filament\Widgets\StatsOverviewWidget\Stat;
|
||||
|
||||
class StatsOverviewWidget extends BaseWidget
|
||||
{
|
||||
public ?Result $result = null;
|
||||
|
||||
protected function getPollingInterval(): ?string
|
||||
{
|
||||
return config('speedtest.dashboard_polling');
|
||||
}
|
||||
|
||||
protected function getCards(): array
|
||||
{
|
||||
$this->result = Result::query()
|
||||
->latest()
|
||||
->first();
|
||||
|
||||
if (blank($this->result) || ! $this->result->successful) {
|
||||
return [
|
||||
Stat::make('Latest download', '-')
|
||||
->icon('heroicon-o-arrow-down-tray'),
|
||||
Stat::make('Latest upload', '-')
|
||||
->icon('heroicon-o-arrow-up-tray'),
|
||||
Stat::make('Latest ping', '-')
|
||||
->icon('heroicon-o-clock'),
|
||||
];
|
||||
}
|
||||
|
||||
$previous = Result::query()
|
||||
->where('id', '<', $this->result->id)
|
||||
->latest()
|
||||
->first();
|
||||
|
||||
if (! $previous || ! $previous->successful) {
|
||||
return [
|
||||
Stat::make('Latest download', fn (): string => ! blank($this->result) ? toBits(convertSize($this->result->download), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-arrow-down-tray'),
|
||||
Stat::make('Latest upload', fn (): string => ! blank($this->result) ? toBits(convertSize($this->result->upload), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-arrow-up-tray'),
|
||||
Stat::make('Latest ping', fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' (ms)' : 'n/a')
|
||||
->icon('heroicon-o-clock'),
|
||||
];
|
||||
}
|
||||
|
||||
$downloadChange = percentChange($this->result->download, $previous->download, 2);
|
||||
$uploadChange = percentChange($this->result->upload, $previous->upload, 2);
|
||||
$pingChange = percentChange($this->result->ping, $previous->ping, 2);
|
||||
|
||||
return [
|
||||
Stat::make('Latest download', fn (): string => ! blank($this->result) ? toBits(convertSize($this->result->download), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-arrow-down-tray')
|
||||
->description($downloadChange > 0 ? $downloadChange.'% faster' : abs($downloadChange).'% slower')
|
||||
->descriptionIcon($downloadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
|
||||
->color($downloadChange > 0 ? 'success' : 'danger'),
|
||||
Stat::make('Latest upload', fn (): string => ! blank($this->result) ? toBits(convertSize($this->result->upload), 2).' (Mbps)' : 'n/a')
|
||||
->icon('heroicon-o-arrow-up-tray')
|
||||
->description($uploadChange > 0 ? $uploadChange.'% faster' : abs($uploadChange).'% slower')
|
||||
->descriptionIcon($uploadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
|
||||
->color($uploadChange > 0 ? 'success' : 'danger'),
|
||||
Stat::make('Latest ping', fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' (ms)' : 'n/a')
|
||||
->icon('heroicon-o-clock')
|
||||
->description($pingChange > 0 ? $pingChange.'% slower' : abs($pingChange).'% faster')
|
||||
->descriptionIcon($pingChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
|
||||
->color($pingChange > 0 ? 'danger' : 'success'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -106,14 +106,4 @@ class Result extends Model
|
||||
'ping' => $data['ping']['jitter'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the previous test result.
|
||||
*/
|
||||
public function previous(): ?self
|
||||
{
|
||||
return static::orderByDesc('id')
|
||||
->where('id', '<', $this->id)
|
||||
->first();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
|
||||
use Filament\Models\Contracts\FilamentUser;
|
||||
use Filament\Panel;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
@@ -48,7 +49,7 @@ class User extends Authenticatable implements FilamentUser
|
||||
/**
|
||||
* Any user can access the Filament admin panel.
|
||||
*/
|
||||
public function canAccessFilament(): bool
|
||||
public function canAccessPanel(Panel $panel): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers\Filament;
|
||||
|
||||
use Awcodes\FilamentVersions\VersionsPlugin;
|
||||
use Filament\FontProviders\LocalFontProvider;
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\DisableBladeIconComponents;
|
||||
use Filament\Http\Middleware\DispatchServingFilamentEvent;
|
||||
use Filament\Navigation\NavigationGroup;
|
||||
use Filament\Navigation\NavigationItem;
|
||||
use Filament\Panel;
|
||||
use Filament\PanelProvider;
|
||||
use Filament\Support\Colors\Color;
|
||||
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
|
||||
use Illuminate\Cookie\Middleware\EncryptCookies;
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
|
||||
use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||
use Illuminate\Session\Middleware\AuthenticateSession;
|
||||
use Illuminate\Session\Middleware\StartSession;
|
||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||
use SpeedtestTrackerVersionProvider;
|
||||
|
||||
class AdminPanelProvider extends PanelProvider
|
||||
{
|
||||
public function panel(Panel $panel): Panel
|
||||
{
|
||||
return $panel
|
||||
->default()
|
||||
->id('admin')
|
||||
->path('admin')
|
||||
->login()
|
||||
->colors([
|
||||
'primary' => Color::Amber,
|
||||
])
|
||||
->font(
|
||||
'Inter',
|
||||
url: asset('fonts/inter/inter.css'),
|
||||
provider: LocalFontProvider::class,
|
||||
)
|
||||
->viteTheme('resources/css/filament/admin/theme.css')
|
||||
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
|
||||
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
|
||||
->pages([])
|
||||
->plugins([
|
||||
VersionsPlugin::make()
|
||||
->hasDefaults(false)
|
||||
->items([
|
||||
new SpeedtestTrackerVersionProvider(),
|
||||
]),
|
||||
])
|
||||
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
|
||||
->widgets([])
|
||||
->databaseNotifications()
|
||||
->databaseNotificationsPolling(config('speedtest.notification_polling'))
|
||||
->maxContentWidth(config('speedtest.content_width'))
|
||||
->middleware([
|
||||
EncryptCookies::class,
|
||||
AddQueuedCookiesToResponse::class,
|
||||
StartSession::class,
|
||||
AuthenticateSession::class,
|
||||
ShareErrorsFromSession::class,
|
||||
VerifyCsrfToken::class,
|
||||
SubstituteBindings::class,
|
||||
DisableBladeIconComponents::class,
|
||||
DispatchServingFilamentEvent::class,
|
||||
])
|
||||
->authMiddleware([
|
||||
Authenticate::class,
|
||||
])
|
||||
->navigationGroups([
|
||||
NavigationGroup::make()
|
||||
->label('Settings'),
|
||||
NavigationGroup::make()
|
||||
->label('System'),
|
||||
NavigationGroup::make()
|
||||
->label('Links')
|
||||
->collapsible(false),
|
||||
])
|
||||
->navigationItems([
|
||||
NavigationItem::make('Documentation')
|
||||
->url('https://docs.speedtest-tracker.dev/', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-book-open')
|
||||
->group('Links'),
|
||||
NavigationItem::make('Donate')
|
||||
->url('https://github.com/sponsors/alexjustesen', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-banknotes')
|
||||
->group('Links'),
|
||||
NavigationItem::make('GitHub')
|
||||
->url('https://github.com/alexjustesen/speedtest-tracker', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-code-bracket')
|
||||
->group('Links'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Settings\GeneralSettings;
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Navigation\NavigationItem;
|
||||
use FilamentVersions\Facades\FilamentVersions;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class FilamentServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap services.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
try {
|
||||
config(['filament.brand' => app(GeneralSettings::class)->site_name ?? config('app.name')]);
|
||||
} catch (\Throwable $th) {
|
||||
// if this fails it's because the migration doesn't exist so it can be skipped
|
||||
}
|
||||
|
||||
FilamentVersions::addItem('Speedtest Tracker', 'v'.config('speedtest.build_version'));
|
||||
|
||||
Filament::serving(function () {
|
||||
Filament::registerNavigationGroups([
|
||||
'Settings',
|
||||
'System',
|
||||
'Links',
|
||||
]);
|
||||
|
||||
Filament::registerNavigationItems([
|
||||
NavigationItem::make('Documentation')
|
||||
->url('https://docs.speedtest-tracker.dev/', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-book-open')
|
||||
->group('Links')
|
||||
->sort(0),
|
||||
NavigationItem::make('Donate')
|
||||
->url('https://github.com/sponsors/alexjustesen', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-cash')
|
||||
->group('Links')
|
||||
->sort(1),
|
||||
NavigationItem::make('Source Code')
|
||||
->url('https://github.com/alexjustesen/speedtest-tracker', shouldOpenInNewTab: true)
|
||||
->icon('heroicon-o-code')
|
||||
->group('Links')
|
||||
->sort(2),
|
||||
]);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -8,8 +8,6 @@ class GeneralSettings extends Settings
|
||||
{
|
||||
public bool $auth_enabled;
|
||||
|
||||
public string $content_width;
|
||||
|
||||
public ?string $speedtest_schedule;
|
||||
|
||||
/** @var string[] */
|
||||
|
||||
@@ -2,25 +2,23 @@
|
||||
"name": "laravel/laravel",
|
||||
"type": "project",
|
||||
"description": "The Laravel Framework.",
|
||||
"keywords": [
|
||||
"framework",
|
||||
"laravel"
|
||||
],
|
||||
"keywords": ["framework", "laravel"],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.1",
|
||||
"awcodes/filament-versions": "^1.1.1",
|
||||
"awcodes/filament-versions": "^2.0",
|
||||
"chrisullyott/php-filesize": "^4.2.1",
|
||||
"doctrine/dbal": "^3.6.6",
|
||||
"dragonmantank/cron-expression": "^3.3.3",
|
||||
"filament/filament": "^2.17.53",
|
||||
"filament/spatie-laravel-settings-plugin": "^2.17.53",
|
||||
"filament/filament": "^3.0.47",
|
||||
"filament/spatie-laravel-settings-plugin": "^3.0.47",
|
||||
"guzzlehttp/guzzle": "^7.8",
|
||||
"influxdata/influxdb-client-php": "^3.4",
|
||||
"laravel-notification-channels/telegram": "^4.0",
|
||||
"laravel/framework": "^10.21.1",
|
||||
"laravel/framework": "^10.22.0",
|
||||
"laravel/sanctum": "^3.3.0",
|
||||
"laravel/tinker": "^2.8.2",
|
||||
"livewire/livewire": "^3.0.2",
|
||||
"maatwebsite/excel": "^3.1.48",
|
||||
"maennchen/zipstream-php": "^2.4",
|
||||
"spatie/laravel-settings": "^2.8.3",
|
||||
@@ -29,11 +27,11 @@
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-ide-helper": "^2.13",
|
||||
"fakerphp/faker": "^1.23.0",
|
||||
"laravel/pint": "^1.12.0",
|
||||
"laravel/sail": "^1.24.0",
|
||||
"laravel/pint": "^1.13.1",
|
||||
"laravel/sail": "^1.24.1",
|
||||
"mockery/mockery": "^1.6.6",
|
||||
"nunomaduro/collision": "^7.8.1",
|
||||
"phpunit/phpunit": "^10.3.2",
|
||||
"phpunit/phpunit": "^10.3.3",
|
||||
"spatie/laravel-ignition": "^2.3"
|
||||
},
|
||||
"autoload": {
|
||||
@@ -54,7 +52,8 @@
|
||||
"scripts": {
|
||||
"post-autoload-dump": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
||||
"@php artisan package:discover --ansi"
|
||||
"@php artisan package:discover --ansi",
|
||||
"@php artisan filament:upgrade"
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@php artisan vendor:publish --tag=laravel-assets --ansi --force",
|
||||
|
||||
@@ -161,7 +161,6 @@ return [
|
||||
/*
|
||||
* Package Service Providers...
|
||||
*/
|
||||
App\Providers\FilamentServiceProvider::class,
|
||||
|
||||
/*
|
||||
* Application Service Providers...
|
||||
@@ -170,6 +169,7 @@ return [
|
||||
App\Providers\AuthServiceProvider::class,
|
||||
// App\Providers\BroadcastServiceProvider::class,
|
||||
App\Providers\EventServiceProvider::class,
|
||||
App\Providers\Filament\AdminPanelProvider::class,
|
||||
App\Providers\RouteServiceProvider::class,
|
||||
])->toArray(),
|
||||
|
||||
|
||||
@@ -1,199 +1,16 @@
|
||||
<?php
|
||||
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\DispatchServingFilamentEvent;
|
||||
use Filament\Http\Middleware\MirrorConfigToSubpackages;
|
||||
use Filament\Widgets;
|
||||
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
|
||||
use Illuminate\Cookie\Middleware\EncryptCookies;
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
|
||||
use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||
use Illuminate\Session\Middleware\AuthenticateSession;
|
||||
use Illuminate\Session\Middleware\StartSession;
|
||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filament Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The default is `admin` but you can change it to whatever works best and
|
||||
| doesn't conflict with the routing in your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => env('FILAMENT_PATH', 'admin'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filament Core Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the path which Filament will use to load its core routes and assets.
|
||||
| You may change it if it conflicts with your other routes.
|
||||
|
|
||||
*/
|
||||
|
||||
'core_path' => env('FILAMENT_CORE_PATH', 'filament'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filament Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may change the domain where Filament should be active. If the domain
|
||||
| is empty, all domains will be valid.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => env('FILAMENT_DOMAIN'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Homepage URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the URL that Filament will redirect the user to when they click
|
||||
| on the sidebar's header.
|
||||
|
|
||||
*/
|
||||
|
||||
'home_url' => '/admin',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Brand Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This will be displayed on the login page and in the sidebar's header.
|
||||
|
|
||||
*/
|
||||
|
||||
'brand' => env('APP_NAME'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Auth
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the configuration that Filament will use to handle authentication
|
||||
| into the admin panel.
|
||||
|
|
||||
*/
|
||||
|
||||
'auth' => [
|
||||
'guard' => env('FILAMENT_AUTH_GUARD', 'web'),
|
||||
'pages' => [
|
||||
'login' => \Filament\Http\Livewire\Auth\Login::class,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pages
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the namespace and directory that Filament will automatically
|
||||
| register pages from. You may also register pages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'pages' => [
|
||||
'namespace' => 'App\\Filament\\Pages',
|
||||
'path' => app_path('Filament/Pages'),
|
||||
'register' => [
|
||||
// Pages\Dashboard::class,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resources
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the namespace and directory that Filament will automatically
|
||||
| register resources from. You may also register resources here.
|
||||
|
|
||||
*/
|
||||
|
||||
'resources' => [
|
||||
'namespace' => 'App\\Filament\\Resources',
|
||||
'path' => app_path('Filament/Resources'),
|
||||
'register' => [],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Widgets
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the namespace and directory that Filament will automatically
|
||||
| register dashboard widgets from. You may also register widgets here.
|
||||
|
|
||||
*/
|
||||
|
||||
'widgets' => [
|
||||
'namespace' => 'App\\Filament\\Widgets',
|
||||
'path' => app_path('Filament/Widgets'),
|
||||
'register' => [
|
||||
Widgets\AccountWidget::class,
|
||||
// Widgets\FilamentInfoWidget::class,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Livewire
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the namespace and directory that Filament will automatically
|
||||
| register Livewire components inside.
|
||||
|
|
||||
*/
|
||||
|
||||
'livewire' => [
|
||||
'namespace' => 'App\\Filament',
|
||||
'path' => app_path('Filament'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Dark mode
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By enabling this feature, your users are able to select between a light
|
||||
| and dark appearance for the admin panel, or let their system decide.
|
||||
|
|
||||
*/
|
||||
|
||||
'dark_mode' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database notifications
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By enabling this feature, your users are able to open a slide-over within
|
||||
| the admin panel to view their database notifications.
|
||||
|
|
||||
*/
|
||||
|
||||
'database_notifications' => [
|
||||
'enabled' => true,
|
||||
'polling_interval' => env('NOTIFICATION_POLLING', '60s'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Broadcasting
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By uncommenting the Laravel Echo configuration, you may connect your
|
||||
| admin panel to any Pusher-compatible websockets server.
|
||||
| By uncommenting the Laravel Echo configuration, you may connect Filament
|
||||
| to any Pusher-compatible websockets server.
|
||||
|
|
||||
| This will allow your admin panel to receive real-time notifications.
|
||||
| This will allow your users to receive real-time notifications.
|
||||
|
|
||||
*/
|
||||
|
||||
@@ -208,73 +25,6 @@ return [
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Layout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the configuration for the general layout of the admin panel.
|
||||
|
|
||||
| You may configure the max content width from `xl` to `7xl`, or `full`
|
||||
| for no max width.
|
||||
|
|
||||
*/
|
||||
|
||||
'layout' => [
|
||||
'actions' => [
|
||||
'modal' => [
|
||||
'actions' => [
|
||||
'alignment' => 'left',
|
||||
],
|
||||
],
|
||||
],
|
||||
'forms' => [
|
||||
'actions' => [
|
||||
'alignment' => 'left',
|
||||
],
|
||||
'have_inline_labels' => false,
|
||||
],
|
||||
'footer' => [
|
||||
'should_show_logo' => true,
|
||||
],
|
||||
'max_content_width' => null,
|
||||
'notifications' => [
|
||||
'vertical_alignment' => 'bottom',
|
||||
'alignment' => 'right',
|
||||
],
|
||||
'sidebar' => [
|
||||
'is_collapsible_on_desktop' => true,
|
||||
'groups' => [
|
||||
'are_collapsible' => true,
|
||||
],
|
||||
'width' => null,
|
||||
'collapsed_width' => null,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Favicon
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the path to the favicon used for pages in the admin panel.
|
||||
|
|
||||
*/
|
||||
|
||||
'favicon' => env('app.url').'/img/speedtest-tracker-icon.png',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Avatar Provider
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the service that will be used to retrieve default avatars if one
|
||||
| has not been uploaded.
|
||||
|
|
||||
*/
|
||||
|
||||
'default_avatar_provider' => \Filament\AvatarProviders\UiAvatarsProvider::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
@@ -285,48 +35,6 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DRIVER', 'public'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Google Fonts
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the URL for Google Fonts that should be loaded. You may use any
|
||||
| font, or set to `null` to prevent any Google Fonts from loading.
|
||||
|
|
||||
| When using a custom font, you should also set the font family in your
|
||||
| custom theme's `tailwind.config.js` file.
|
||||
|
|
||||
*/
|
||||
|
||||
'google_fonts' => 'https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Middleware
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may customise the middleware stack that Filament uses to handle
|
||||
| requests.
|
||||
|
|
||||
*/
|
||||
|
||||
'middleware' => [
|
||||
'auth' => [
|
||||
Authenticate::class,
|
||||
],
|
||||
'base' => [
|
||||
EncryptCookies::class,
|
||||
AddQueuedCookiesToResponse::class,
|
||||
StartSession::class,
|
||||
AuthenticateSession::class,
|
||||
ShareErrorsFromSession::class,
|
||||
VerifyCsrfToken::class,
|
||||
SubstituteBindings::class,
|
||||
DispatchServingFilamentEvent::class,
|
||||
MirrorConfigToSubpackages::class,
|
||||
],
|
||||
],
|
||||
'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'),
|
||||
|
||||
];
|
||||
|
||||
@@ -10,10 +10,17 @@ return [
|
||||
|
||||
'build_version' => '0.12.0-beta.3',
|
||||
|
||||
/**
|
||||
* General
|
||||
*/
|
||||
'content_width' => env('CONTENT_WIDTH', '7xl'),
|
||||
|
||||
/**
|
||||
* Polling
|
||||
*/
|
||||
'dashboard_polling' => env('DASHBOARD_POLLING', '60s'),
|
||||
|
||||
'notification_polling' => env('NOTIFICATION_POLLING', '60s'),
|
||||
|
||||
'results_polling' => env('RESULTS_POLLING', null),
|
||||
];
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
{
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.27",
|
||||
"laravel-vite-plugin": "^0.5.0",
|
||||
"lodash": "^4.17.19",
|
||||
"postcss": "^8.1.14",
|
||||
"vite": "^3.0.0"
|
||||
"@tailwindcss/forms": "^0.5.6",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
"autoprefixer": "^10.4.15",
|
||||
"laravel-vite-plugin": "^0.7.3",
|
||||
"postcss": "^8.4.29",
|
||||
"tailwindcss": "^3.3.3",
|
||||
"vite": "^4.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"resources/css/filament/admin/theme.css": {
|
||||
"file": "assets/theme-03c153f0.css",
|
||||
"isEntry": true,
|
||||
"src": "resources/css/filament/admin/theme.css"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.tippy-box[data-theme~=light]{color:#26323d;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;background-color:#fff}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}
|
||||
@@ -0,0 +1,200 @@
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("Inter-Thin.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Thin.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("Inter-ThinItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-ThinItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("Inter-ExtraLight.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-ExtraLight.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 200;
|
||||
font-display: swap;
|
||||
src: url("Inter-ExtraLightItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-ExtraLightItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("Inter-Light.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Light.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("Inter-LightItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-LightItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("Inter-Regular.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Regular.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("Inter-Italic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Italic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("Inter-Medium.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Medium.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("Inter-MediumItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-MediumItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("Inter-SemiBold.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-SemiBold.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-SemiBoldItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("Inter-Bold.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Bold.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("Inter-BoldItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-BoldItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("Inter-ExtraBold.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-ExtraBold.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("Inter-ExtraBoldItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-ExtraBoldItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("Inter-Black.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-Black.woff?v=3.19") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("Inter-BlackItalic.woff2?v=3.19") format("woff2"),
|
||||
url("Inter-BlackItalic.woff?v=3.19") format("woff");
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------
|
||||
Variable font.
|
||||
Usage:
|
||||
|
||||
html { font-family: 'Inter', sans-serif; }
|
||||
@supports (font-variation-settings: normal) {
|
||||
html { font-family: 'Inter var', sans-serif; }
|
||||
}
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Inter var';
|
||||
font-weight: 100 900;
|
||||
font-display: swap;
|
||||
font-style: normal;
|
||||
font-named-instance: 'Regular';
|
||||
src: url("Inter-roman.var.woff2?v=3.19") format("woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter var';
|
||||
font-weight: 100 900;
|
||||
font-display: swap;
|
||||
font-style: italic;
|
||||
font-named-instance: 'Italic';
|
||||
src: url("Inter-italic.var.woff2?v=3.19") format("woff2");
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
[EXPERIMENTAL] Multi-axis, single variable font.
|
||||
|
||||
Slant axis is not yet widely supported (as of February 2019) and thus this
|
||||
multi-axis single variable font is opt-in rather than the default.
|
||||
|
||||
When using this, you will probably need to set font-variation-settings
|
||||
explicitly, e.g.
|
||||
|
||||
* { font-variation-settings: "slnt" 0deg }
|
||||
.italic { font-variation-settings: "slnt" 10deg }
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Inter var experimental';
|
||||
font-weight: 100 900;
|
||||
font-display: swap;
|
||||
font-style: oblique 0deg 10deg;
|
||||
src: url("Inter.var.woff2?v=3.19") format("woff2");
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
function r({state:i}){return{state:i,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0&&this.addRow(),this.updateState(),this.$watch("state",(t,e)=>{let s=o=>o===null?0:Array.isArray(o)?o.length:typeof o!="object"?0:Object.keys(o).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows),s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.rows=e,this.updateState()},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default};
|
||||
@@ -0,0 +1 @@
|
||||
function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},input:{["x-on:blur"]:"createTag()",["x-model"]:"newTag",["x-on:keydown"](t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},["x-on:paste"](){$nextTick(()=>{let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};
|
||||
@@ -0,0 +1 @@
|
||||
function t({initialHeight:e}){return{init:function(){this.render()},render:function(){this.$el.scrollHeight>0&&(this.$el.style.height=e+"rem",this.$el.style.height=this.$el.scrollHeight+"px")}}}export{t as default};
|
||||