Skip to content

[테이블.필터] 커스텀 필터

커스텀 필터 폼

폼 빌더의 컴포넌트를 사용하여 커스텀 필터 폼을 만들 수 있습니다. 커스텀 필터 폼의 데이터는 query() 콜백의 $data 배열에서 사용할 수 있습니다:

php
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;
use Illuminate\Database\Eloquent\Builder;

Filter::make('created_at')
    ->form([
        DatePicker::make('created_from'),
        DatePicker::make('created_until'),
    ])
    ->query(function (Builder $query, array $data): Builder {
        return $query
            ->when(
                $data['created_from'],
                fn (Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date),
            )
            ->when(
                $data['created_until'],
                fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date),
            );
    })
커스텀 필터 폼이 있는 테이블

커스텀 필터 필드의 기본값 설정

커스텀 필터 폼의 필드 기본값을 커스터마이즈하려면 default() 메서드를 사용할 수 있습니다:

php
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;

Filter::make('created_at')
    ->form([
        DatePicker::make('created_from'),
        DatePicker::make('created_until')
            ->default(now()),
    ])

활성 인디케이터

필터가 활성화되면, 테이블 쿼리가 범위 지정되었음을 알리기 위해 테이블 콘텐츠 위에 인디케이터가 표시됩니다.

필터 인디케이터가 있는 테이블

기본적으로 필터의 라벨이 인디케이터로 사용됩니다. indicator() 메서드를 사용하여 이를 오버라이드할 수 있습니다:

php
use Filament\Tables\Filters\Filter;

Filter::make('is_admin')
    ->label('관리자만?')
    ->indicator('관리자')

커스텀 필터 폼을 사용하는 경우, 활성 인디케이터를 표시하려면 indicateUsing()를 사용해야 합니다.

참고: 필터에 인디케이터가 없으면, 테이블에서 활성화된 필터의 개수를 나타내는 배지 카운트에 해당 필터가 포함되지 않습니다.

커스텀 활성 인디케이터

모든 인디케이터가 단순하지는 않으므로, 언제든지 표시할 인디케이터를 커스터마이즈하려면 indicateUsing()을 사용할 수 있습니다.

예를 들어, 커스텀 날짜 필터가 있다면, 선택한 날짜를 포맷팅하는 커스텀 인디케이터를 만들 수 있습니다:

php
use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;

Filter::make('created_at')
    ->form([DatePicker::make('date')])
    // ...
    ->indicateUsing(function (array $data): ?string {
        if (! $data['date']) {
            return null;
        }

        return '생성일: ' . Carbon::parse($data['date'])->toFormattedDateString();
    })

다중 활성 인디케이터

여러 개의 인디케이터를 한 번에 렌더링할 수도 있습니다. Indicator 객체의 배열을 반환하면 됩니다. 서로 다른 필드가 서로 다른 인디케이터와 연관되어 있다면, 필터가 제거될 때 올바른 필드가 리셋되도록 Indicator 객체의 removeField() 메서드를 사용해야 합니다:

php
use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\Indicator;

Filter::make('created_at')
    ->form([
        DatePicker::make('from'),
        DatePicker::make('until'),
    ])
    // ...
    ->indicateUsing(function (array $data): array {
        $indicators = [];

        if ($data['from'] ?? null) {
            $indicators[] = Indicator::make('생성일(이후): ' . Carbon::parse($data['from'])->toFormattedDateString())
                ->removeField('from');
        }

        if ($data['until'] ?? null) {
            $indicators[] = Indicator::make('생성일(이전): ' . Carbon::parse($data['until'])->toFormattedDateString())
                ->removeField('until');
        }

        return $indicators;
    })

인디케이터 제거 방지

Indicator 객체에서 removable(false)를 사용하여 사용자가 인디케이터를 제거하지 못하도록 할 수 있습니다:

php
use Carbon\Carbon;
use Filament\Tables\Filters\Indicator;

Indicator::make('생성일(이후): ' . Carbon::parse($data['from'])->toFormattedDateString())
    ->removable(false)

나를 위한 문서 한글화