Initial commit
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
@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>
|
||||
Reference in New Issue
Block a user