Files
roxane/app/Filament/Widgets/LatestMembershipsWidget.php

78 lines
2.6 KiB
PHP
Raw Permalink Normal View History

2026-04-10 12:33:06 +02:00
<?php
namespace App\Filament\Widgets;
use App\Filament\Resources\Memberships\MembershipResource;
use App\Models\Membership;
use Filament\Actions\Action;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget;
use Illuminate\Database\Eloquent\Builder;
class LatestMembershipsWidget extends TableWidget
{
protected static ?int $sort = 3;
protected static ?string $heading = 'Dernières adhésions';
protected int|string|array $columnSpan = 'full';
public function table(Table $table): Table
{
return $table
->query(
fn (): Builder => Membership::query()
->with(['member', 'package'])
->latest()
->limit(8)
)
->columns([
TextColumn::make('member.full_name')
->label('Adhérent')
->searchable(['members.firstname', 'members.lastname']),
TextColumn::make('package.name')
->label('Package'),
TextColumn::make('status')
->label('Statut adhésion')
->formatStateUsing(fn (string $state) => Membership::getAttributeLabel($state))
->badge()
->color(fn (string $state): string => match ($state) {
'active' => 'success',
'expired' => 'danger',
'pending' => 'warning',
default => 'gray',
}),
TextColumn::make('payment_status')
->label('Paiement')
->formatStateUsing(fn (string $state) => Membership::getAttributeLabel($state))
->badge()
->color(fn (string $state): string => match ($state) {
'paid' => 'success',
'unpaid' => 'danger',
'partial' => 'warning',
default => 'gray',
}),
TextColumn::make('amount')
->label('Montant')
->money('EUR'),
TextColumn::make('created_at')
->label('Créée le')
->dateTime('d/m/Y')
->sortable(),
])
->recordActions([
Action::make('edit')
->label('Voir')
->icon('heroicon-o-pencil-square')
->url(fn (Membership $record): string => MembershipResource::getUrl('edit', ['record' => $record])),
])
->paginated(false);
}
}