Skip to main content

Dokumentasi Implementasi Tree DataTable

Dokumentasi ini menjelaskan perubahan dari implementasi DataTable standar (flat) menjadi Tree DataTable (hierarkis) yang mampu menampilkan data dengan struktur induk-anak (parent-child).

Perbedaan Utama: Flat DataTable vs. Tree DataTable

Perbedaan mendasar terletak pada cara data disiapkan di backend (Laravel) dan cara data dirender di frontend (Vue & TanStack Table). 1. Struktur Data (Backend)
  • Flat DataTable:
  • Struktur: Backend mengirimkan data dalam bentuk array datar (flat array) dari hasil paginasi Laravel. Contoh: [{ id: 1, name: 'A' }, { id: 2, name: 'B' }].
  • Query: Menggunakan ->paginate() untuk membatasi jumlah data per halaman. Logika query sangat sederhana.
  • Tree DataTable:
  • Struktur: Backend mengirimkan data dalam bentuk array yang sudah tersusun secara hierarkis (nested). Setiap objek data memiliki properti _children yang berisi array dari anak-anaknya. Contoh: [{ id: 1, name: 'Parent', _children: [{ id: 2, name: 'Child' }] }].
  • Query: Tidak lagi menggunakan paginasi. Controller akan mengambil semua data yang relevan lalu membangun struktur pohon di memori server sebelum dikirim ke frontend.
  • Logika Pencarian:
  • Pada flat data, pencarian hanya menampilkan baris yang cocok.
  • Pada tree data, pencarian akan menemukan baris yang cocok, lalu menelusuri ke atas (ancestors) untuk menyertakan semua induknya hingga ke akar (root). Semua induk dari hasil pencarian akan ditandai _expanded: true agar otomatis terbuka dan menampilkan hasil yang relevan.
2. Logika Komponen (Frontend)
  • Flat DataTable:
  • Komponen: Menggunakan satu komponen DataTable.vue yang generik.
  • TanStack Table: Konfigurasi dasar hanya menggunakan getCoreRowModel().
  • Rendering: Setiap baris dirender secara sekuensial tanpa ada indentasi atau tombol expand/collapse.
  • Tree DataTable:
  • Komponen: Menggunakan komponen baru TreeDataTable.vue yang dirancang khusus untuk data hierarkis.
  • TanStack Table: Menggunakan fitur tambahan:
  • getSubRows: (row) => row._children: Memberi tahu tabel di mana properti anak berada.
  • getExpandedRowModel(): Mengaktifkan fungsionalitas untuk membuka/menutup baris.
  • Mengelola state baru yaitu expanded.
  • Rendering:
  • Indentasi: Setiap baris anak akan memiliki padding-left untuk menunjukkan kedalamannya (row.depth).
  • Tombol Expand/Collapse: Kolom utama (misalnya name) kini memiliki tombol Chevron yang hanya muncul jika baris tersebut memiliki anak (row.getCanExpand()).
  • Paginasi: Dihilangkan, karena seluruh struktur pohon ditampilkan sekaligus. Footer tabel disederhanakan untuk hanya menampilkan total data dan jumlah baris yang dipilih.
3. Interaksi Pengguna
  • Flat DataTable: Interaksi utama adalah sorting, filtering, dan paginasi.
  • Tree DataTable: Interaksi utama adalah membuka dan menutup cabang pohon untuk menjelajahi data. Ditambah, ada aksi baru seperti [+ Add Child] yang spesifik untuk konteks hierarki.

Implementasi Kode Lengkap

Berikut adalah kumpulan semua file kode yang telah dimodifikasi dan dibuat untuk implementasi Tree DataTable.

1. Backend: MemberController.php

Controller ini diubah untuk membangun struktur data pohon dari data flat di database berdasarkan relasi parentId.

2. Frontend: columns.ts

Definisi kolom dimodifikasi untuk menambahkan tombol expand/collapse pada kolom name dan menambahkan event handler untuk tombol + Add Child.

3. Frontend: components/DataTableRowActions.vue (Modifikasi)

Komponen aksi baris ditambahkan prop onAddChild untuk menangani event klik pada menu + Add Child.

4. Frontend: TreeDataTable.vue (Komponen Baru)

Ini adalah komponen utama yang baru, yang meng-handle rendering tabel hierarkis.

5. Frontend: Index.vue (Halaman Pengguna)

Halaman ini sekarang menggunakan komponen TreeDataTable.vue dan menangani event @addChild.
Dengan implementasi ini, aplikasi Anda kini memiliki tabel yang kuat untuk menampilkan dan berinteraksi dengan data hierarkis secara efisien.