Pengelola Kolom
Column manager memungkinkan pengguna memilih kolom mana yang ditampilkan tabel dan, jika tabel mengizinkannya, mengatur urutan kolom tersebut. Gunakan pada tabel yang cukup lebar sehingga tidak semua pengguna membutuhkan semua kolom — dalam praktiknya, hampir semua tabel dengan lebih dari sekitar enam kolom.
Visibility dan order merupakan state server. Request menyatakan pilihan, schema memvalidasinya, dan state()['columns'] melaporkan susunan yang benar-benar diterapkan.
Contoh minimal tabel yang dapat dikelola
use PandaPanel\Tables\Columns\DateTimeColumn;
use PandaPanel\Tables\Columns\TextColumn;
use PandaPanel\Tables\TableSchema;
return $table
->columns([
TextColumn::make('reference')->toggleable(false),
TextColumn::make('customer'),
TextColumn::make('status'),
TextColumn::make('internal_notes')->visible(false),
DateTimeColumn::make('created_at'),
])
->reorderableColumns()
->persistColumnsInSession();2
3
4
5
6
7
8
9
10
11
12
13
14
Saat pertama dibuka, tabel menampilkan reference, customer, status, dan created_at. internal_notes tersedia di manager tetapi tersembunyi sampai pengguna memilih menampilkannya, sedangkan reference tidak pernah dapat disembunyikan.
Deklarasi pada kolom
| Method | Signature | Default | Arti |
|---|---|---|---|
visible() | visible(bool $visible = true): static | true | apakah kolom ditampilkan sebelum pengguna mengubah apa pun |
toggleable() | toggleable(bool $toggleable = true): static | true | apakah pengguna boleh menyembunyikan kolom |
Keduanya independen. visible(false) menentukan posisi awal; toggleable(false) adalah aturan. Kolom yang tidak toggleable tetap visible apa pun yang diminta request. Biasanya ini digunakan untuk kolom yang mengidentifikasi record karena tabel tanpa kolom identitas hanyalah kumpulan row anonim.
$schema->defaultVisibleColumnNames(); // ['reference', 'customer', 'status', 'created_at']
$schema->toggleableColumnNames(); // ['customer', 'status', 'internal_notes', 'created_at']
$schema->columnNames(); // every column, in declared order2
3
Cara state dibaca
Manager menulis state ke query string:
?columns[visible][]=customer&columns[visible][]=status
&columns[order][]=status&columns[order][]=customer2
TableQuery mengubahnya menjadi {visible: string[], order: string[]} berdasarkan empat aturan:
- Nama yang tidak dikenal dibuang.
columns[visible][]=passwordtidak menghasilkan apa pun jika tabel tidak memiliki kolom tersebut. - Nama yang duplikat pada order diabaikan. Kemunculan pertama yang digunakan.
- Kolom yang tidak disebut dalam arrangement mempertahankan tempat deklarasinya, dan ditambahkan setelah nama yang disebut. Dengan demikian, menambahkan kolom baru ke schema tidak membuatnya otomatis hilang bagi semua pengguna yang pernah menyusun layout lama.
- Kolom non-toggleable selalu dimasukkan kembali ke
visible, terlepas dari isi request.
visible kemudian dilaporkan mengikuti arrangement order, sehingga frontend dapat merendernya langsung tanpa perlu menyusun ulang.
$state = $tableQuery->state();
$state['columns']['visible']; // list<string>, in the order they are drawn
$state['columns']['order']; // list<string>, every column2
3
4
Jika request sama sekali tidak menyebut columns, visible fallback ke defaultVisibleColumnNames() dan order fallback ke urutan deklarasi.
Perilaku
return $table
->reorderableColumns()
->columnManagerInModal()
->columnManagerTrigger('Layout', 'settings')
->deferColumnManager()
->showColumnManagerReset(false)
->persistColumnsInSession();2
3
4
5
6
7
| Method | Signature | Default |
|---|---|---|
reorderableColumns() | reorderableColumns(bool $reorderable = true): self | false |
deferColumnManager() | deferColumnManager(bool $defer = true): self | false |
columnManagerTrigger() | columnManagerTrigger(string $label, ?string $icon = null): self | Columns, tanpa icon |
columnManagerInModal() | columnManagerInModal(bool $inModal = true): self | false |
showColumnManagerReset() | showColumnManagerReset(bool $show = true): self | true |
persistColumnsInSession() | persistColumnsInSession(bool $persist = true): self | false |
Method pembaca: hasReorderableColumns(): bool dan persistsColumnsInSession(): bool.
reorderableColumns() mengatur kolom dan tidak pernah menulis ke database. Kolom yang ingin dilihat pengguna adalah preferensi UI, bukan data record. Method yang mengatur baris lalu menulis urutan ke kolom database adalah reorderable() — lihat Reordering.
columnManagerInModal() membuka manager sebagai dialog, bukan popover. Daftar kolom panjang lebih nyaman dikelola ketika halaman di belakangnya diredupkan, dan drag-to-reorder membutuhkan ruang tambahan.
deferColumnManager() menahan perubahan sampai pengguna menjalankan apply action. Gunakan pada tabel dengan render mahal sehingga men-toggle enam kolom seharusnya tidak menghasilkan enam request.
Data yang diterima frontend
toArray()['columnManager']:
| Key | Sumber |
|---|---|
reorderable | reorderableColumns() |
deferred | deferColumnManager() |
triggerLabel | columnManagerTrigger(), default Columns |
triggerIcon | columnManagerTrigger(), default null |
resetLabel | selalu Reset |
showReset | showColumnManagerReset() |
modal | columnManagerInModal() |
toggleable | toggleableColumnNames() |
Tidak ada setter untuk resetLabel; hanya visibility reset action yang dapat dikonfigurasi.
Persistence
$table->persistColumnsInSession();Arrangement diingat per pengguna menggunakan session key yang dibangun dari panel id dan resource slug, ditambah relation key untuk relation table. Aturannya sama seperti sort, search, dan filters:
- Request selalu menang ketika menyatakan apa pun, termasuk ketika arrangement sekarang kosong.
?columns=me-reset ke layout deklarasi. - Hanya ketidakhadiran parameter yang membuat sistem fallback ke state yang tersimpan.
- Arrangement yang diingat melewati validasi yang sama seperti arrangement baru, sehingga session lama yang menyebut kolom yang sudah dihapus akan diabaikan.
- Tabel tanpa session middleware hanya tidak mengingat apa pun; tidak ada error.
Lihat State tabel yang dipertahankan.
Pengujian
use Illuminate\Http\Request;
use PandaPanel\Tables\TableQuery;
use PandaPanel\Tables\TableSchema;
$request = Request::create('/', 'GET', [
'columns' => ['visible' => ['status'], 'order' => ['status', 'customer']],
]);
$request->setLaravelSession(app('session.store'));
$state = (new TableQuery($schema, $request, null, 'panel.admin.table.orders'))->state();
expect($state['columns']['order'])->toBe(['status', 'customer', 'reference', 'internal_notes', 'created_at'])
->and($state['columns']['visible'])->toBe(['status', 'reference']);2
3
4
5
6
7
8
9
10
11
12
13
14
Kolom reference berada di visible karena tidak toggleable, dan posisinya tetap mengikuti arrangement.
Hal yang perlu diperhatikan
- Menyembunyikan kolom tidak menghapus cell-nya dari payload. Row tetap membawa cell untuk semua kolom yang dideklarasikan; visibility hanya presentation. Kolom yang mahal dihitung dan jarang digunakan sebaiknya ditempatkan pada tabel lain, bukan hanya disembunyikan dengan
visible(false). - Manager tidak dapat menyembunyikan kolom non-toggleable, dan frontend juga tidak menampilkan toggle untuk kolom tersebut. UI dibangun dari list
columnManager.toggleable. - Order dan visibility masing-masing diperlakukan sebagai satu keputusan utuh. Mengirim
columns[visible]tanpacolumns[order]mempertahankan order deklarasi, dan sebaliknya. - TanStack tidak menyimpan salinan state ini. Server adalah single source of truth untuk kolom yang tampil. Menyimpan state kedua di client berarti menciptakan dua jawaban untuk pertanyaan yang sama.
- Pinned column digambar di sisi tempatnya dipasang terlepas dari arrangement. Freezing memiliki prioritas atas order. Lihat Kolom frozen dan pinned.