TR
Başlangıç
77 · DataTable

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.

PRO AcunDataTable
01

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.

PHP
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);
    }
}
PropDeğerler
query()Zorunlu: temel sorgu
columns()Zorunlu: Column listesi
$titleAraç çubuğundaki başlık
02

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.

PHP
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');
PropDeğ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
03

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.

PHP
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')];
}
PropDeğerler
SearchModePrefix (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
04

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.

PHP
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}%"))),
    ];
}
PropDeğ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
05

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.

PHP
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
    ];
}
PropDeğ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
06

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.

PHP
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()),
    ];
}
PropDeğ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
07

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.

PHP
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()),
    ];
}
PropDeğ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
08

İş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ü.

PHP
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'];
}
PropDeğ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
09

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.

PHP
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');
}
PropDeğerler
queue_threshold5000 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
ExportScopecurrent_page · filtered · selected · all
10

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.

PHP
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'),
    ];
}
11

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.

PHP
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.'];
}
12

Ö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

PHP
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(),
        ];
    }
}
13

Ö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

PHP
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';
}
14

Ö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

PHP
protected function scrollX(): bool
{
    return true;
}

protected function scrollY(): ?string
{
    return '400px';   // '28rem', 'min(70vh, 42rem)' …
}
15

Ö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

PHP
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'),
    ];
}
16

Ö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

PHP
protected function fixedHeader(): bool
{
    return true;
}
17

Ö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

PHP
protected function fixedColumns(): array
{
    return ['start' => 1, 'end' => true];
}

protected function scrollX(): bool
{
    return true;
}
18

Ö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

PHP
protected function exportActions(): array
{
    return [ExportAction::csv(), ExportAction::pdf(), ExportAction::json(), ExportAction::print(), ExportAction::copy()];
}

protected function utilityActions(): array
{
    return [UtilityAction::refresh(), UtilityAction::columns()];
}
19

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.

PHP
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'],
    ],
];
API

Prop'lar ve slot'lar

Bileşenin kabul ettiği değerler.

PropVarsayılanAçıklama
$title''Araç çubuğundaki başlık ve tablonun erişilebilir adı
$stickyHeaderconfig: falseEski ad: scrollY('min(70vh, 42rem)') ile aynı
scrollX()falseHücreler tek satırda, geniş tablo kutusunda yana kayar (Column::wrap() kolonları alt satıra geçer)
scrollY()nullKutu yüksekliği ('400px'): tablo kutuda aşağı kayar, başlık üstte kalır
fixedHeader()falseSayfa 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 trueArama kutusu; searchPlaceholder() metnini verir
showsColumnPicker()null (otomatik)false: Kolonlar düğmesi yok, true: her zaman
showsPerPageSelector()trueSayfa boyutu kutusu ("25")
perPageOptions() / defaultPerPage()config per_page / default_per_pageTabloya özel sayfa boyutu seçenekleri ve açılıştaki boyut
paginationOnEachSide()1Geç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:paginationSayfalama 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)nullEtkin filtre sayısı ("0" değeri de sayılır); null: hepsi, true: araç çubuğu, false: panel
clearFilters(?bool $toolbar)nullFiltreleri 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)
Acun UI · DataTable motoruDetaylı kullanım ve örnekler