simedkom/app/Filament/Widgets/Stats/OverviewStats.php

101 lines
3.2 KiB
PHP

<?php
namespace App\Filament\Widgets\Stats;
use App\Enums\IsActive;
use App\Models\Classification;
use App\Models\DataChangeRequest;
use App\Models\Department;
use App\Models\Journalist;
use App\Models\Location;
use App\Models\PartnerMedia;
use App\Models\Theme;
use App\Models\VerificationRequest;
use App\Models\Visitor;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Support\Icons\Heroicon;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class OverviewStats extends BaseWidget
{
use HasWidgetShield;
protected static ?int $sort = 1;
protected int|string|array $columnSpan = 'full';
protected ?string $pollingInterval = null;
protected function getStats(): array
{
$totalJournalists = Journalist::count();
$totalMedia = PartnerMedia::count();
$average = $totalMedia > 0 ? round($totalJournalists / $totalMedia, 1) : 0;
return [
Stat::make('Total Klasifikasi', Classification::active()->count())
->description('Klasifikasi aktif')
->descriptionIcon(Heroicon::OutlinedBookOpen)
->color($this->getRandomColor()),
Stat::make('Total Lokus', Location::active()->count())
->description('Lokus aktif')
->descriptionIcon(Heroicon::OutlinedMapPin)
->color($this->getRandomColor()),
Stat::make('Total OPD', Department::where('is_active', IsActive::ACTIVE)->count())
->description('OPD aktif')
->descriptionIcon(Heroicon::OutlinedBuildingLibrary)
->color($this->getRandomColor()),
Stat::make('Total Tema', Theme::active()->count())
->description('Tema aktif')
->descriptionIcon(Heroicon::OutlinedPuzzlePiece)
->color($this->getRandomColor()),
Stat::make('Total Jurnalis', $totalJournalists)
->description('Jurnalis terdaftar')
->descriptionIcon(Heroicon::OutlinedIdentification)
->color($this->getRandomColor()),
Stat::make('Antrean Verifikasi', VerificationRequest::pending()->count())
->description('Butuh tindakan')
->descriptionIcon(Heroicon::OutlinedPencilSquare)
->color($this->getRandomColor()),
Stat::make('Antrean Perubahan', DataChangeRequest::pending()->count())
->description('Perubahan data')
->descriptionIcon(Heroicon::OutlinedDocumentText)
->color($this->getRandomColor()),
Stat::make('Total Pengunjung', Visitor::count())
->description('Total traffic')
->descriptionIcon(Heroicon::OutlinedChartBar)
->color($this->getRandomColor()),
];
}
private array $availableColors = [
'primary',
'success',
'warning',
'danger',
'info',
'fuchsia',
'indigo',
'violet',
'orange',
'cyan',
'emerald',
'amber',
'rose',
'lime',
];
private function getRandomColor(): string
{
return $this->availableColors[array_rand($this->availableColors)];
}
}