45 lines
1.3 KiB
PHP
45 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Widgets;
|
|
|
|
use App\Models\Student;
|
|
use Filament\Tables;
|
|
use Filament\Tables\Table;
|
|
use Filament\Widgets\TableWidget as BaseWidget;
|
|
|
|
class AdminRankingWidgets extends BaseWidget
|
|
{
|
|
protected static ?int $sort = 2;
|
|
public static function canView(): bool
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// protected int | string | array $columnSpan = 'full'; // Atur lebar widget jika perlu
|
|
|
|
protected function getHeading(): string
|
|
{
|
|
return 'Ranking';
|
|
}
|
|
|
|
public function table(Table $table): Table
|
|
{
|
|
return $table
|
|
->query(
|
|
Student::select('students.id', 'students.full_name')
|
|
->join('assessments', 'students.id', '=', 'assessments.student_id')
|
|
->selectRaw('AVG(assessments.score) as average_score')
|
|
->groupBy('students.id', 'students.full_name')
|
|
->orderByDesc('average_score')
|
|
)
|
|
->columns([
|
|
Tables\Columns\TextColumn::make('full_name')
|
|
->label('Nama Siswa'),
|
|
Tables\Columns\TextColumn::make('average_score')
|
|
->label('Rata-rata Nilai')
|
|
->sortable()
|
|
->formatStateUsing(fn ($state) => number_format($state, 2)),
|
|
]);
|
|
}
|
|
}
|