DataTable motoru
Kolon, filtre ve işlemleri bir PHP sınıfında tanımlanan hazır Livewire tablosu. Arama, filtre, sıralama, seçim ve sayfalama sunucuda çalışır; tarayıcıya yalnızca görünen sayfa gider. Ayrıntılı kılavuz: DataTable.
Tablo sınıfı
DataTable sınıfını (ya da eş adı AcunDataTable) genişletin; query() ve columns() zorunludur. Kayıt görünürlüğü query() içindeki kapsamla, tabloya erişim authorizeTable() ile sınırlanır. Sayfada <livewire:orders-table /> ile kullanın.
use Acun\Ui\DataTable\DataTable;
final class OrdersTable extends DataTable
{
public string $title = 'Siparişler';
protected function query(): Builder
{
return Order::query()->visibleTo(auth()->user())->select(['id', 'number', 'customer_name', 'is_paid']);
}
protected function columns(): array
{
return [
Column::make('Sipariş no', 'number')->searchable()->sortable(),
Column::make('Müşteri', 'customer_name')->searchable(SearchMode::Contains)->sortable(),
Column::make('Ödendi', 'is_paid')->boolean(),
];
}
protected function authorizeTable(): void
{
$this->authorize('viewAny', Order::class);
}
}
| Prop | Değerler |
|---|---|
query() | Zorunlu: temel sorgu |
columns() | Zorunlu: Column listesi |
$title | Araç çubuğundaki başlık |
Kolonlar
Column::make(etiket, alan) ile tanımlanır; alan ilişki için noktalı olabilir. Biçimlendiriciler değeri Türkçe biçimde yazar. renderUsing() çıktısı kaçışlanır; HTML içeren hücreler için $row ve $column alan bir view() kullanın. priority() sütunun dar ekranda ne zaman gizleneceğini belirler: 1 ve 2 her zaman görünür, 3 38rem (608px) altında, 4 ve üstü 52rem (832px) altında gizlenir.
Column::make('Tutar', 'toplam')->money('TRY')->align('right')->width('140px');
Column::make('Adet', 'adet')->number()->align('center');
Column::make('Teslim tarihi', 'teslim_tarihi')->date()->sortable()->priority(3);
Column::make('Kayıt', 'created_at')->dateTime()->hidden();
Column::make('Müşteri', 'musteri.ad')->nowrap();
Column::make('Temsilci', 'temsilci_id')->renderUsing(fn ($satir, $deger) => $satir->temsilci?->ad_soyad ?? '—');
Column::make('Durum', 'aktif_mi')->view('tablolar.hucreler.durum');
| Prop | Değerler |
|---|---|
sortable() · searchable(mod) | Sıralama ve arama listesine alır |
hidden() · width() · align() · nowrap() | Görünüm; align: left | center | right |
wrap() | Uzun metin alt satıra geçer, scrollX() tablosunda da; width() ile kullanın |
priority(n) | 1 | 2 (hep görünür) · 3 (< 38rem gizli) · 4 ve üstü (< 52rem gizli) |
date() · dateTime() · number() · money() · boolean() | d.m.Y · d.m.Y H:i · 1.234 · ₺ · Aktif/Pasif |
renderUsing(fn) · view(ad) | Özel hücre içeriği |
Arama
Arama kutusu 400 ms bekleyip sunucuda arar. Aranabilir kolonlar tek bir gruplanmış koşulda "veya" ile bağlanır; query() kapsamı korunur. Her kolon, migration'da searchColumn() ile eklenen normalize edilmiş {alan}_search kolonunda aranır; Türkçe karakter ve büyük/küçük harf farkı her modda yoktur ("ayse" → Ayşe). Modu veri tipine göre seçin. Kolon olarak gösterilmeyen alanları searchFields() ile ekleyin. Arama değişince sayfa başa döner ve seçim temizlenir.
Column::make('Vergi no', 'vergi_no')->searchable(SearchMode::Exact);
Column::make('Kod', 'ozel_kod')->searchable(); // Prefix (varsayılan)
Column::make('Adres', 'adres')->searchable(SearchMode::Contains);
Column::make('Ad soyad', 'ad')->searchable('contains', column: 'ad_soyad_search');
protected function searchFields(): array
{
return [...parent::searchFields(), SearchField::make('eposta')];
}
| Prop | Değerler |
|---|---|
SearchMode | Prefix (varsayılan, indeksli) | Exact (indeksli) | Contains (tarama) | FullText (MySQL FULLTEXT; başka veritabanlarında contains) |
searchable(mod, column) | column: birden çok kaynaktan üretilmiş arama kolonu |
searchFields() | Kolon olmayan alanlarda da arar |
Filtreler
Filtreler varsayılan olarak araç çubuğundaki Filtreler düğmesiyle açılan panelde listelenir. select ve boolean bir "Tümü" seçeneğiyle gelir, seçeneği verilmeyen boolean Evet/Hayır gösterir. Aralık filtreleri iki alan gösterir; sayı aralığında bunlar "En az" ve "En çok" ipuçlarını taşır. Tarih filtreleri gün bazında karşılaştırır. Projeye özel koşul için applyUsing() kullanın.
protected function filters(): array
{
return [
Filter::select('Durum', 'aktif_mi')->options(['1' => 'Aktif', '0' => 'Pasif']),
Filter::multiSelect('Bölge', 'bolge')->options(['dogu' => 'Doğu', 'bati' => 'Batı']),
Filter::dateRange('Teslim tarihi', 'teslim_tarihi'),
Filter::numberRange('Tutar', 'toplam'),
Filter::boolean('Hediye paketi', 'hediye_mi'),
Filter::text('Müşteri', 'musteri')
->applyUsing(fn (Builder $sorgu, string $deger) => $sorgu->whereHas('musteri', fn ($q) => $q->where('ad', 'like', "%{$deger}%"))),
];
}
| Prop | Değerler |
|---|---|
Filter:: | text | select | multiSelect | boolean | date | dateRange | number | numberRange |
options([...]) | select, multiSelect ve boolean seçenekleri |
applyUsing(fn ($sorgu, $deger)) | Varsayılan koşulun yerine geçer |
Araç çubuğu filtreleri
Sık kullanılan filtreleri inToolbar() ile panelden çıkarıp araç çubuğuna alın: başlık, arama ve düğmelerin altında kendi satırlarında hep görünür kalırlar. Her biri solda etiketi olan tek bir çerçeveli gruptur (ör. Durum | Tümü). Çoklu seçim, onay kutulu bir menü açar; özetinde "Tümü" ya da "N seçili" yazar. Panel yalnızca araç çubuğunda olmayan filtreleri listeler; Filtreler düğmesinin rozeti yalnızca bunları sayar, paneldeki "Filtreleri temizle" de yalnızca bunları temizler. Bütün filtreler araç çubuğundaysa Filtreler düğmesi gösterilmez.
protected function filters(): array
{
return [
Filter::select('Durum', 'aktif_mi')->options(['1' => 'Aktif', '0' => 'Pasif'])->inToolbar(),
Filter::multiSelect('Bölge', 'bolge')->options(['dogu' => 'Doğu', 'bati' => 'Batı', 'guney' => 'Güney'])->inToolbar(),
Filter::dateRange('Teslim tarihi', 'teslim_tarihi'), // panelde kalır
];
}
| Prop | Değerler |
|---|---|
inToolbar() | Filtreyi araç çubuğunda gösterir |
inDrawer() | Filtreler panelinde tutar (varsayılan; açıkça yazmak için) |
toggleFilterValue($anahtar, $deger) | Çoklu seçim menüsünün çağırdığı metot; yalnızca tanımlı bir çoklu seçim filtresini ve onun tanımlı seçeneklerinden birini kabul eder, sonra sayfayı başa alıp seçimi temizler |
activeFilterCount(true | false) | Yalnızca araç çubuğu (true) ya da panel (false) filtrelerini sayar; argümansız hepsi |
clearFilters(true | false) | Yalnızca araç çubuğu ya da panel filtrelerini temizler; argümansız hepsi |
Satır işlemleri
Her satırın sonunda "•••" menüsünde listelenir. visible() işlemi o satırda gizler, authorize() düğmeyi pasif yapar; ikisi de işlem çalıştırılırken sunucuda yeniden kontrol edilir. İşlem ($satir, $tablo) alır; style('danger') kırmızı gösterir. icon() bir acun:icon adı alır ve etiketin önüne küçük (1rem) bir ikon koyar.
protected function actions(): array
{
return [
Action::make('Düzenle')
->icon('pencil-square')
->authorize(fn (Order $order) => auth()->user()->can('update', $order))
->action(fn (Order $order) => $this->redirectRoute('siparisler.duzenle', $order)),
Action::make('Sil')
->icon('trash')
->style('danger')
->visible(fn (Order $order) => $order->isCancelled())
->authorize(fn (Order $order) => auth()->user()->can('delete', $order))
->action(fn (Order $order) => $order->delete()),
];
}
| Prop | Değerler |
|---|---|
icon(ad) | Etiketin önündeki acun:icon adı (ör. pencil-square) |
visible(fn) | Satırda gösterilsin mi |
authorize(fn) | Çalıştırma yetkisi |
style() | danger: kırmızı |
action(fn ($satir, $tablo)) | İşlem |
Toplu işlemler ve satır yetkisi
Seçim yapılınca tablonun üstünde seçim çubuğu çıkar; "Filtreye uyan N kaydın tamamını seç" ile tüm sonuçlar seçilebilir. İşlem seçili kayıtları içeren sorguyu alır ve onay sorusundan sonra çalışır. authorize() işlemin tamamını, authorizeRow() hedeflenen her kaydı sunucuda kontrol eder: kayıtlardan biri bile geçemezse hiçbir kayda dokunulmaz ve 403 döner. Satır işlemlerinde olduğu gibi icon() düğmedeki etiketin önüne ikon ekler.
protected function bulkActions(): array
{
return [
BulkAction::make('Kargoya ver')
->icon('truck')
->authorize(fn () => auth()->user()->can('updateAny', Order::class))
->action(fn (Builder $sorgu) => $sorgu->update(['status' => OrderStatus::Shipped])),
BulkAction::make('Sil')
->icon('trash')
->style('danger')
->authorize(fn () => auth()->user()->can('deleteAny', Order::class))
->authorizeRow(fn (Order $order) => auth()->user()->can('delete', $order))
->action(fn (Builder $sorgu) => $sorgu->delete()),
];
}
| Prop | Değerler |
|---|---|
icon(ad) | Düğmedeki etiketin önündeki acun:icon adı (ör. truck) |
style() | danger: kırmızı düğme |
authorize(fn) | İşlemin tamamı için yetki |
authorizeRow(fn ($satir)) | Her kayıt için yetki; biri geçemezse işlem durur |
action(fn ($sorgu, $tablo)) | Seçili kayıtların sorgusu |
İşlemler: araç çubuğu, dışa aktarma ve araçlar
Tablo sınıfında headerActions(), exportActions() ve utilityActions() metotlarını ezin; hepsi isteğe bağlıdır. Masaüstünde sayfa boyutu ve arama soldadır; Filtreler, Yenile, Kolonlar, Dışa aktar, "⋮" menüsü ve en sonda başlık işlemleri sağdadır; telefonda ilk başlık işlemi ve bir "İşlemler" düğmesi kalır, düğme diğer araçları alt alta açar. Gizli (visible) ya da yetkisiz (can, authorize) işlem çizilmez ve tarayıcıdan çağrılırsa sunucu 403 döner. action() bir closure ya da tablonun (public veya protected) bir metodunun adını alır. Tarayıcı tarafı PRO JS içindeki acunDataTable bileşenindedir (import '@acunsoft/acun-ui-pro'). Ayrıntılar: DataTable: tüm seçenekler kılavuzu, İşlemler bölümü.
use Acun\Ui\DataTable\Actions\ExportAction;
use Acun\Ui\DataTable\Actions\TableAction;
use Acun\Ui\DataTable\Actions\UtilityAction;
protected function headerActions(): array
{
return [
TableAction::make('create')->label('Yeni sipariş')->icon('plus')
->url(fn () => route('siparisler.create'))
->can('create', Order::class)
->shortcut('mod+shift+n'),
TableAction::make('sync')->label('Senkronize et')->icon('arrow-path')->color('gray')
->action('senkronizeEt') // protected function senkronizeEt(): void
->confirm('Siparişler senkronize edilsin mi?')
->loadingLabel('Senkronize ediliyor…')
->successMessage('Siparişler güncellendi.'),
];
}
protected function exportActions(): array
{
return [
ExportAction::csv()->shortcut('mod+e'),
ExportAction::pdf(), // yazdırma sayfası → tarayıcıda "PDF olarak kaydet"
ExportAction::json()->can('export-json'),
ExportAction::print(),
ExportAction::copy(), // mevcut sayfa ya da seçim, sekmeyle ayrılmış metin
];
}
protected function utilityActions(): array
{
return [
UtilityAction::refresh(),
UtilityAction::columns(),
UtilityAction::fullscreen(),
UtilityAction::resetFilters(),
UtilityAction::resetSorting(),
];
}
protected function defaultSort(): ?array
{
return ['field' => 'created_at', 'direction' => 'desc'];
}
| Prop | Değerler |
|---|---|
label() · icon() · color() · variant() · tooltip() | Görünüm; icon bir acun:icon adı |
visible() · hidden() · disabled() | bool ya da closure; gizli olan çizilmez ve çalışmaz |
can($yetki, $arg) · authorize(fn) | Gate::allows ya da özel kontrol; sunucuda her çağrıda |
url($url, newTab: true) · action(fn | 'metot') | Bağlantı ya da işlem |
confirm($mesaj, $başlık, $düğme) | acun:confirmation-dialog ile onay |
shortcut('mod+e') · loadingLabel() · successMessage() | Kısayol (mod: Ctrl / ⌘), yükleme yazısı, başarı bildirimi |
defaultSort() | Kolon seçilene kadarki sıra; "Sıralamayı sıfırla" buna döner |
density() | Satır yoğunluğu: compact, normal ya da comfortable (kullanıcı menüsünde yoktur) |
rowDetails() | Satır başında (+): satırın bütün alanları bir pencerede; responsive · always · null |
Dışa aktarma kapsamı ve kuyruk
"Dışa aktar" menüsü önce kapsamı sorar: Mevcut sayfa, Filtrelenmiş kayıtlar, Seçili kayıtlar (n) ya da Tüm kayıtlar (onay ister). Varsayılan: seçim varsa seçim, arama ya da filtre varsa filtrelenmiş kayıtlar, yoksa mevcut sayfa. Her kapsam query() kapsamını ve sıralamayı korur; satırlar tablonun kendi buildQuery() hattıyla, parça parça okunur. Kolonlar görünen kolonlardır ve hücrelerle aynı biçimde düz metin olarak yazılır. queue_threshold üstündeki dışa aktarmayı bir kuyruk işi aynı kullanıcı adına hazırlar; bitince bildirimde imzalı, sahibine özel bir indirme bağlantısı çıkar (php artisan queue:work gerekir). PDF yazdırma sayfasını açar, dosyayı tarayıcı kaydeder; ek paket gerekmez. CSV UTF-8 BOM ve ; ile yazılır.
Column::make('Tutar', 'amount')->money('TRY')->exportUsing(fn (Order $order) => $order->amount);
Column::make('Harita', 'konum')->view('hucreler.harita')->exportable(false);
Column::make('Kod', 'ozel_kod')->toggleable(false); // Kolonlar menüsünden gizlenemez
// Kendi biçiminiz: Contracts\ExportDriver (extension, mimeType, write)
ExportAction::make('xml')->label('XML')->icon('code-bracket')->driver(XmlExportDriver::class);
// İlişkiler için dışa aktarma sorgusuna eager load
protected function exportQuery(ExportScope $kapsam): Builder
{
return parent::exportQuery($kapsam)->with('musteri');
}
| Prop | Değerler |
|---|---|
queue_threshold | 5000 satıra kadar hemen iner, üstü kuyruğa |
exportUsing(fn ($satir, $deger)) | Kolonun dışa aktarılan değeri |
exportable(false) · toggleable(false) | Dışa aktarılmaz · hep görünür |
ExportScope | current_page · filtered · selected · all |
Toplu ve satır işlemleri (yeni sınıflar)
Actions\BulkAction ve Actions\RowAction adla oluşturulur (make('approve')). Hazırlar: BulkAction::delete(), exportSelected('csv'), printSelected(); RowAction::view($url), edit($url), delete(). Toplu işlem closure'u $query, $ids, $records, $count alabilir ve varsayılan olarak onay ister. Bir satırda üçten fazla işlem görünürse ilk ikisi düğme, gerisi "⋮" menüsündedir. Eski Action ve BulkAction aynen çalışmaya devam eder.
use Acun\Ui\DataTable\Actions\BulkAction;
use Acun\Ui\DataTable\Actions\RowAction;
protected function bulkActions(): array
{
return [
BulkAction::make('kargola')->label('Kargoya ver')->icon('truck')
->action(fn (Builder $sorgu) => $sorgu->update(['status' => OrderStatus::Shipped]))
->successMessage(':count sipariş kargoya verildi.'),
BulkAction::exportSelected('csv'),
BulkAction::printSelected(),
BulkAction::delete()->authorizeRow(fn (Order $order) => auth()->user()->can('delete', $order)),
];
}
protected function actions(): array
{
return [
RowAction::view(fn (Order $order) => route('siparisler.show', $order)),
RowAction::edit(fn (Order $order) => route('siparisler.edit', $order))->can('update'),
RowAction::make('arsivle')->label('Arşivle')->icon('archive-box')
->visible(fn (Order $order) => ! $order->isArchived())
->action(fn (Order $order) => $order->archive()),
RowAction::delete()->can('delete'),
];
}
Boş durum
Varsayılan metinler arama ya da filtre varken "Sonuç bulunamadı.", yokken "Henüz kayıt bulunmuyor." olur. Kendi metinleriniz için emptyState() metodunu ezin.
protected function emptyState(): array
{
return $this->search !== '' || $this->activeFilterCount() > 0
? ['title' => 'Eşleşen sipariş yok.', 'description' => 'Aramayı ya da filtreleri değiştirin.']
: ['title' => 'Henüz sipariş yok.', 'description' => 'Yeni sipariş düğmesiyle ilk siparişi oluşturun.'];
}
Örnek: Temel
En küçük DataTable: query() hangi kayıtların, columns() hangi kolonların listeleneceğini söyler. Arama, sıralama ve sayfalama kendiliğinden gelir. Demo: https://demo.acunsoft.test/admin/tables/datatable/basic
final class BasicOrdersTable extends DataTable
{
protected function query(): Builder
{
return Order::query();
}
protected function columns(): array
{
return [
Column::make('Sipariş no', 'number')->searchable()->sortable(),
Column::make('Müşteri', 'customer_name')->searchable('contains')->sortable(),
Column::make('Tutar', 'amount')->money('TRY')->align('right')->sortable(),
Column::make('Sipariş tarihi', 'ordered_at')->dateTime()->sortable(),
];
}
}
Örnek: Responsive
priority(3) kolonları 38rem, priority(4) kolonları 52rem altında gizlenir; rowDetails('responsive') yalnızca bir kolon gizliyken satır başına (+) koyar ve gizli alanları bir pencerede gösterir. Pencereyi daraltın ya da telefonda açın. Demo: https://demo.acunsoft.test/admin/tables/datatable/responsive
protected function columns(): array
{
return [
Column::make('Sipariş no', 'number')->sortable(),
Column::make('Müşteri', 'customer_name'),
Column::make('Durum', 'status')->view('tables.cells.order-status')->priority(3),
Column::make('Ürün', 'product')->priority(4),
Column::make('Şehir', 'city')->priority(4),
];
}
protected function rowDetails(): ?string
{
return 'responsive';
}
Örnek: Kaydırmalı tablo
scrollX() hücreleri tek satırda tutar ve geniş tabloyu yana kaydırır (Column::wrap() kolonları alt satıra geçer); scrollY() kutuya yükseklik verir, tablo kutunun içinde aşağı kayar ve başlık satırı üstte kalır. CSS ile çalışır, JS gerekmez. Demo: https://demo.acunsoft.test/admin/tables/datatable/scroll
protected function scrollX(): bool
{
return true;
}
protected function scrollY(): ?string
{
return '400px'; // '28rem', 'min(70vh, 42rem)' …
}
Örnek: Sunucu taraflı (Ajax)
Her DataTable böyle çalışır: arama, filtre, sıralama ya da sayfa değişikliği bir Livewire (Ajax) isteğidir; paket bunu query() sorgusuna SQL olarak ekler, sorgu veritabanında çalışır ve tarayıcıya yalnızca açık sayfanın satırları döner. 5.000 kayıtla 5 milyon kayıt aynı hızda açılır. Demo: https://demo.acunsoft.test/admin/tables/datatable/server-side
protected function query(): Builder
{
return Order::query(); // arama, filtre, sıralama ve sayfalama buna eklenir
}
protected function filters(): array
{
return [
Filter::multiSelect('Durum', 'status')->options(OrderStatus::options())->inToolbar(),
Filter::dateRange('Sipariş tarihi', 'ordered_at'),
];
}
Örnek: Sabit başlık
Sayfa kaydırılırken başlık satırı üst çubuğun altında kalır; tablonun sonunda tabloyla birlikte çıkar. Kalan başlıktan sıralama ve "tümünü seç" çalışır; tam ekranda ve telefonda da. scrollY() ile birlikte verilirse scrollY() kazanır. PRO JS ister. Demo: https://demo.acunsoft.test/admin/tables/datatable/fixed-header
protected function fixedHeader(): bool
{
return true;
}
Örnek: Sabit kolonlar
Tablo yana kayarken start ile seçim, (+) ve ilk n veri kolonu solda, end ile işlemler kolonu sağda kalır; altından içerik geçerken kenarda gölge görünür. Telefonda (640 px altı) yalnızca soldakiler sabittir. scrollX() ve fixedHeader() ile birlikte kullanılabilir. PRO JS ister. Demo: https://demo.acunsoft.test/admin/tables/datatable/fixed-columns
protected function fixedColumns(): array
{
return ['start' => 1, 'end' => true];
}
protected function scrollX(): bool
{
return true;
}
Örnek: Düğmeler (dışa aktarma)
CSV, JSON, PDF (yazdırma sayfasından "PDF olarak kaydet"), yazdırma ve kopyalama. Dışa aktar menüsünde kapsam seçilir (bu sayfa, filtreye uyanlar, seçilenler, tümü); dosya sunucuda tablonun sorgusuyla hazırlanır, büyük dosyalar kuyrukta hazırlanıp indirme bağlantısıyla gelir. Demo: https://demo.acunsoft.test/admin/tables/datatable/buttons
protected function exportActions(): array
{
return [ExportAction::csv(), ExportAction::pdf(), ExportAction::json(), ExportAction::print(), ExportAction::copy()];
}
protected function utilityActions(): array
{
return [UtilityAction::refresh(), UtilityAction::columns()];
}
Yapılandırma
Genel ayarlar php artisan vendor:publish --tag=acun-ui-config ile yayınlanan config/acun-ui.php dosyasındadır. Sayfa boyutu yalnızca per_page listesindeki bir değer olabilir; başka bir değer varsayılana döner.
return [
'datatable' => [
'per_page' => [10, 25, 50, 100],
'default_per_page' => 25,
'search_debounce' => 400, // ms
'url_state' => true, // arama, sıralama, filtre, kolonlar URL'de
'sticky_header' => false, // true: her tabloda scrollY('min(70vh, 42rem)'); tablo bazında $stickyHeader
'pagination' => 'paginate', // paginate · simple · cursor
'actions' => ['enabled' => true],
'exports' => [
'enabled' => true,
'queue_threshold' => 5000, // üstü kuyruk işine
'chunk_size' => 1000,
'disk' => 'local',
'directory' => 'exports',
'queue' => null,
'connection' => null,
'expire_minutes' => 60, // indirme bağlantısının ömrü
'poll_seconds' => 3,
'cache_store' => null, // işçiyle paylaşılan cache
'csv_delimiter' => ';',
'copy_max_rows' => 1000,
],
'print' => ['layout' => 'acun-ui-pro::components.data-table.print', 'max_rows' => 2000], // PDF de bu sayfayı açar
'density' => ['default' => 'normal'], // compact · normal · comfortable; tablo density() ile değiştirir
'columns' => ['persist' => 'none'], // none · session
'routes' => ['middleware' => ['web', 'auth'], 'prefix' => 'acun-ui/data-table'],
],
];
Prop'lar ve slot'lar
Bileşenin kabul ettiği değerler.
| Prop | Varsayılan | Açıklama |
|---|---|---|
$title | '' | Araç çubuğundaki başlık ve tablonun erişilebilir adı |
$stickyHeader | config: false | Eski ad: scrollY('min(70vh, 42rem)') ile aynı |
scrollX() | false | Hücreler tek satırda, geniş tablo kutusunda yana kayar (Column::wrap() kolonları alt satıra geçer) |
scrollY() | null | Kutu yüksekliği ('400px'): tablo kutuda aşağı kayar, başlık üstte kalır |
fixedHeader() | false | Sayfa kaydırılırken başlık satırı üst çubuğun altında kalır; scrollY() ile birlikte scrollY() kazanır (PRO JS) |
fixedColumns() | [] | ['start' => n, 'end' => true]: seçim, (+) ve ilk n kolon solda, işlemler sağda kalır (PRO JS) |
query() | — | Zorunlu. Temel sorgu; kayıt kapsamı burada |
columns() | — | Zorunlu. Column listesi |
filters() | [] | Filter listesi |
headerActions() | [] | Araç çubuğu işlemleri (Actions\TableAction) |
exportActions() | [] | Dışa aktar menüsü (Actions\ExportAction) |
utilityActions() | [] | Yenile, Kolonlar, tam ekran, sıfırlama (Actions\UtilityAction); boşsa kolon menüsü yine görünür |
actions() | [] | Satır işlemleri (Actions\RowAction ya da eski Action) |
bulkActions() | [] | Toplu işlemler (Actions\BulkAction ya da eski BulkAction) |
defaultSort() | null | ['field' => …, 'direction' => 'desc']: kolon seçilene kadarki sıra |
density() | config density.default ('normal') | 'compact' · 'normal' · 'comfortable': tablonun satır yoğunluğu |
showsSearch() | aranacak alan varsa true | Arama kutusu; searchPlaceholder() metnini verir |
showsColumnPicker() | null (otomatik) | false: Kolonlar düğmesi yok, true: her zaman |
showsPerPageSelector() | true | Sayfa boyutu kutusu ("25") |
perPageOptions() / defaultPerPage() | config per_page / default_per_page | Tabloya özel sayfa boyutu seçenekleri ve açılıştaki boyut |
paginationOnEachSide() | 1 | Geçerli sayfanın iki yanındaki sayfa numarası sayısı |
rowDetails() | null | 'responsive' (yalnızca kolon gizlenince) · 'always': satır ayrıntıları penceresi |
paginationMode() / paginationView() | config pagination / acun:pagination | Sayfalama türü (paginate · simple · cursor) ve görünümü |
exportQuery(ExportScope) | — | Dışa aktarma sorgusu; eager load için ezin |
authorizeTable() | — | İlk yüklemede ve sonraki her Livewire isteğinde çalışır |
emptyState() | — | ['title' => …, 'description' => …] |
buildQuery() | — | Arama, filtre ve sıralama uygulanmış sorgu (ör. dışa aktarma için) |
activeFilterCount(?bool $toolbar) | null | Etkin filtre sayısı ("0" değeri de sayılır); null: hepsi, true: araç çubuğu, false: panel |
clearFilters(?bool $toolbar) | null | Filtreleri temizler, sayfayı başa alır, seçimi sıfırlar; null: hepsi, true: araç çubuğu, false: panel |
toggleFilterValue($key, $value) | — | Çoklu seçim filtresinde bir seçeneği işaretler ya da kaldırır; tanımsız filtre ya da seçenek yok sayılır |
URL durumu | — | q · sort · direction · filters · perPage · columns (url_state açıkken) |