mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-30 18:46:51 +01:00 
			
		
		
		
	 da195fd2fe
			
		
	
	
		da195fd2fe
		
			
		
	
	
	
	
		
			
			* Not found property rule * Make these “better” * Day 1 * Day 2 * Day 3 * Dat 4 * Remove disabled check * Day 4 continued * Run pint * Final changes hopefully * Pint fixes * Fix again * Reset these * Update app/Filament/Admin/Pages/Health.php Co-authored-by: MartinOscar <40749467+rmartinoscar@users.noreply.github.com> * Update app/Traits/CheckMigrationsTrait.php Co-authored-by: MartinOscar <40749467+rmartinoscar@users.noreply.github.com> --------- Co-authored-by: MartinOscar <40749467+rmartinoscar@users.noreply.github.com>
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Filament\Admin\Pages;
 | |
| 
 | |
| use Carbon\Carbon;
 | |
| use Filament\Actions\Action;
 | |
| use Filament\Notifications\Notification;
 | |
| use Filament\Pages\Page;
 | |
| use Illuminate\Support\Facades\Artisan;
 | |
| use Spatie\Health\Commands\RunHealthChecksCommand;
 | |
| use Spatie\Health\Enums\Status;
 | |
| use Spatie\Health\ResultStores\ResultStore;
 | |
| 
 | |
| class Health extends Page
 | |
| {
 | |
|     protected static ?string $navigationIcon = 'tabler-heart';
 | |
| 
 | |
|     protected static string $view = 'filament.pages.health';
 | |
| 
 | |
|     /** @var array<string, string> */
 | |
|     protected $listeners = [
 | |
|         'refresh-component' => '$refresh',
 | |
|     ];
 | |
| 
 | |
|     public function getTitle(): string
 | |
|     {
 | |
|         return trans('admin/health.title');
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationLabel(): string
 | |
|     {
 | |
|         return trans('admin/health.title');
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationGroup(): ?string
 | |
|     {
 | |
|         return trans('admin/dashboard.advanced');
 | |
|     }
 | |
| 
 | |
|     public static function canAccess(): bool
 | |
|     {
 | |
|         return auth()->user()->can('view health');
 | |
|     }
 | |
| 
 | |
|     protected function getActions(): array
 | |
|     {
 | |
|         return [
 | |
|             Action::make('refresh')
 | |
|                 ->label(trans('admin/health.refresh'))
 | |
|                 ->button()
 | |
|                 ->action('refresh'),
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     protected function getViewData(): array
 | |
|     {
 | |
|         // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions
 | |
|         $checkResults = app(ResultStore::class)->latestResults();
 | |
| 
 | |
|         if ($checkResults === null) {
 | |
|             Artisan::call(RunHealthChecksCommand::class);
 | |
| 
 | |
|             $this->dispatch('refresh-component');
 | |
|         }
 | |
| 
 | |
|         return [
 | |
|             'lastRanAt' => new Carbon($checkResults?->finishedAt),
 | |
|             'checkResults' => $checkResults,
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public function refresh(): void
 | |
|     {
 | |
|         Artisan::call(RunHealthChecksCommand::class);
 | |
| 
 | |
|         $this->dispatch('refresh-component');
 | |
| 
 | |
|         Notification::make()
 | |
|             ->title(trans('admin/health.results_refreshed'))
 | |
|             ->success()
 | |
|             ->send();
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationBadge(): ?string
 | |
|     {
 | |
|         // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions
 | |
|         $results = app(ResultStore::class)->latestResults();
 | |
| 
 | |
|         if ($results === null) {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         $results = json_decode($results->toJson(), true);
 | |
| 
 | |
|         $failed = array_reduce($results['checkResults'], function ($numFailed, $result) {
 | |
|             return $numFailed + ($result['status'] === 'failed' ? 1 : 0);
 | |
|         }, 0);
 | |
| 
 | |
|         return $failed === 0 ? null : (string) $failed;
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationBadgeColor(): string
 | |
|     {
 | |
|         return self::getNavigationBadge() > null ? 'danger' : '';
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationBadgeTooltip(): ?string
 | |
|     {
 | |
|         // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions
 | |
|         $results = app(ResultStore::class)->latestResults();
 | |
| 
 | |
|         if ($results === null) {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         $results = json_decode($results->toJson(), true);
 | |
| 
 | |
|         $failedNames = array_reduce($results['checkResults'], function ($carry, $result) {
 | |
|             if ($result['status'] === 'failed') {
 | |
|                 $carry[] = $result['name'];
 | |
|             }
 | |
| 
 | |
|             return $carry;
 | |
|         }, []);
 | |
| 
 | |
|         return trans('admin/health.checks.failed') . implode(', ', $failedNames);
 | |
|     }
 | |
| 
 | |
|     public static function getNavigationIcon(): string
 | |
|     {
 | |
|         // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions
 | |
|         $results = app(ResultStore::class)->latestResults();
 | |
| 
 | |
|         if ($results === null) {
 | |
|             return 'tabler-heart-question';
 | |
|         }
 | |
| 
 | |
|         return $results->containsFailingCheck() ? 'tabler-heart-exclamation' : 'tabler-heart-check';
 | |
|     }
 | |
| 
 | |
|     public function backgroundColor(string $str): string
 | |
|     {
 | |
|         return match ($str) {
 | |
|             Status::ok()->value => 'bg-success-100 dark:bg-success-200',
 | |
|             Status::warning()->value => 'bg-warning-100 dark:bg-warning-200',
 | |
|             Status::skipped()->value => 'bg-info-100 dark:bg-info-200',
 | |
|             Status::failed()->value, Status::crashed()->value => 'bg-danger-100 dark:bg-danger-200',
 | |
|             default => 'bg-gray-100 dark:bg-gray-200'
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     public function iconColor(string $str): string
 | |
|     {
 | |
|         return match ($str) {
 | |
|             Status::ok()->value => 'text-success-500 dark:text-success-600',
 | |
|             Status::warning()->value => 'text-warning-500 dark:text-warning-600',
 | |
|             Status::skipped()->value => 'text-info-500 dark:text-info-600',
 | |
|             Status::failed()->value, Status::crashed()->value => 'text-danger-500 dark:text-danger-600',
 | |
|             default => 'text-gray-500 dark:text-gray-600'
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     public function icon(string $str): string
 | |
|     {
 | |
|         return match ($str) {
 | |
|             Status::ok()->value => 'tabler-circle-check',
 | |
|             Status::warning()->value => 'tabler-exclamation-circle',
 | |
|             Status::skipped()->value => 'tabler-circle-chevron-right',
 | |
|             Status::failed()->value, Status::crashed()->value => 'tabler-circle-x',
 | |
|             default => 'tabler-help-circle'
 | |
|         };
 | |
|     }
 | |
| }
 |