columns([ ImageColumn::make('image_url') ->label('Aperçu') ->square(), TextColumn::make('name') ->label('Nom') ->searchable() ->sortable(), TextColumn::make('category') ->label('Catégorie') ->badge() ->color('gray') ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('body_part') ->label('Partie du corps') ->badge() ->sortable(), TextColumn::make('equipment') ->label('Équipement') ->badge() ->toggleable(), TextColumn::make('target') ->label('Muscle cible') ->badge(), ]) ->filters([ SelectFilter::make('category') ->label('Catégorie') ->options(fn (): array => self::distinctOptions('category')), SelectFilter::make('body_part') ->label('Partie du corps') ->options(fn (): array => self::distinctOptions('body_part')), SelectFilter::make('equipment') ->label('Équipement') ->options(fn (): array => self::distinctOptions('equipment')), SelectFilter::make('target') ->label('Muscle cible') ->options(fn (): array => self::distinctOptions('target')), ]) ->recordActions([ ViewAction::make(), ]) ->defaultSort('name'); } /** * Valeurs distinctes d'une colonne pour alimenter un filtre (clé = valeur = libellé brut). * * @return array */ private static function distinctOptions(string $column): array { return Exercise::query() ->whereNotNull($column) ->distinct() ->orderBy($column) ->pluck($column, $column) ->all(); } }