Files
landing-api/app/Filament/Pages/Statistics.php
Josep Piguillem 697d333ad4 Add a statistics page to the panel
The most read, reads per language with a daily chart, and published content
nobody opened, each compared with the period before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:19:19 +02:00

85 lines
2.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace App\Filament\Pages;
use App\Support\ViewStats;
use BackedEnum;
use Filament\Pages\Page as FilamentPage;
use Filament\Support\Icons\Heroicon;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Url;
use UnitEnum;
/**
* What people read: the most read, how each language is doing, and what is
* on the site that nobody opened. Counts only — what the frontend reports is
* a daily total per record and language, with nothing about the person.
*/
class Statistics extends FilamentPage
{
public const PERIODS = [7, 30, 90];
protected string $view = 'filament.pages.statistics';
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedChartBar;
protected static ?int $navigationSort = 6;
#[Url]
public int $days = 30;
public function mount(): void
{
if (! in_array($this->days, self::PERIODS, true)) {
$this->days = 30;
}
}
public function updatedDays(): void
{
$this->mount();
}
public static function canAccess(): bool
{
return Auth::user()?->can('panel.access') ?? false;
}
public static function getNavigationGroup(): string|UnitEnum|null
{
return __('panel.groups.content');
}
public static function getNavigationLabel(): string
{
return __('panel.statistics.title');
}
public function getTitle(): string|Htmlable
{
return __('panel.statistics.title');
}
public function stats(): ViewStats
{
return new ViewStats($this->days);
}
/**
* "+52 %", "−10 %", or "new" when there was nothing to compare with.
*/
public function change(int $now, int $before): string
{
if ($before === 0) {
return $now > 0 ? __('panel.statistics.new') : '—';
}
$percent = (int) round(($now - $before) * 100 / $before);
return ($percent > 0 ? '+' : ($percent < 0 ? '−' : '')).abs($percent).' %';
}
}