33 lines
1.5 KiB
PHP
33 lines
1.5 KiB
PHP
@props(['column', 'align' => 'left'])
|
|
|
|
{{--
|
|
Klikalny nagłówek tabeli z sortowaniem.
|
|
- 'column' : klucz sortowania (musi być na whiteliście w kontrolerze).
|
|
- 'align' : left | right | center (domyślnie left).
|
|
Zachowuje bieżące filtry (cały query string), resetuje paginację (?page).
|
|
Strzałka: aktywna kolumna = kierunek (rosnąco/malejąco), pozostałe = neutralna.
|
|
--}}
|
|
|
|
@php
|
|
$activeSort = request('sort');
|
|
$activeDir = request('dir', 'asc') === 'desc' ? 'desc' : 'asc';
|
|
$isActive = $activeSort === $column;
|
|
$nextDir = $isActive && $activeDir === 'asc' ? 'desc' : 'asc';
|
|
|
|
$query = array_merge(request()->except('page'), ['sort' => $column, 'dir' => $nextDir]);
|
|
$url = request()->url() . '?' . http_build_query($query);
|
|
|
|
$alignClass = ['left' => 'text-left', 'right' => 'text-right', 'center' => 'text-center'][$align] ?? 'text-left';
|
|
$justifyClass = ['left' => 'justify-start', 'right' => 'justify-end', 'center' => 'justify-center'][$align] ?? 'justify-start';
|
|
|
|
$arrow = $isActive ? ($activeDir === 'asc' ? '▲' : '▼') : '↕';
|
|
@endphp
|
|
|
|
<th {{ $attributes->merge(['class' => "px-4 py-3 $alignClass"]) }}>
|
|
<a href="{{ $url }}"
|
|
class="group inline-flex items-center gap-1 {{ $justifyClass }} hover:text-primary transition-colors select-none">
|
|
<span>{{ $slot }}</span>
|
|
<span class="text-[0.85em] leading-none {{ $isActive ? 'text-primary' : 'text-on-surface-variant/40 group-hover:text-on-surface-variant' }}">{{ $arrow }}</span>
|
|
</a>
|
|
</th>
|