Skip to content

feat: datatable debounce#1042

Merged
affandii06 merged 3 commits into
rilis-devfrom
feat/datatable_debounce
May 20, 2026
Merged

feat: datatable debounce#1042
affandii06 merged 3 commits into
rilis-devfrom
feat/datatable_debounce

Conversation

@pandigresik
Copy link
Copy Markdown
Contributor

Pull Request: Debounce Pencarian DataTable untuk Mencegah Spam Request

Deskripsi

Implementasi debounce pada fitur pencarian DataTable di seluruh halaman admin OpenKab. Tanpa debounce, setiap karakter yang diketik user langsung memicu request ke server (misal: mengetik "kemiri" menghasilkan 6+ request untuk "k", "ke", "kem", "kemi", "kemir", "kemiri"). Perubahan ini memastikan request hanya dikirim 1x setelah user selesai mengetik.

Perubahan yang dilakukan:

  1. Addition (resources/views/layouts/index.blade.php): Menambahkan searchDelay: 500 pada konfigurasi default DataTable untuk semua tabel di aplikasi.
  2. Addition (resources/views/layouts/index.blade.php): Menambahkan event handler init.dt yang menerapkan custom debounce logic pada input search DataTable.
  3. Modification (resources/views/layouts/index.blade.php): Menghapus default event handler DataTable (keyup.DT input.DT search.DT keydown.DT) dan menggantinya dengan handler custom yang menggunakan setTimeout untuk debounce.

Alasan perubahan:

  • Masalah spam request: Tanpa debounce, setiap keystroke memicu request AJAX ke server. Mengetik kata "kemiri" menghasilkan 6+ request yang tidak perlu.
  • Beban database: Request berulang yang tidak diperlukan meningkatkan beban database secara signifikan, terutama pada tabel dengan data besar.
  • Efisiensi network: Mengurangi traffic network yang tidak perlu dan meningkatkan performa aplikasi secara keseluruhan.
  • User experience: Mencegah UI "berkedip" atau lag akibat multiple draw yang terjadi bersamaan.

Dampak perubahan:

Performance: Request pencarian berkurang drastis (dari N request per kata menjadi 1 request setelah user selesai mengetik)
Database load: Beban query database berkurang signifikan karena tidak ada query parsial yang tidak perlu
Network efficiency: Bandwidth yang digunakan lebih efisien
User experience: Pencarian tetap responsif dengan delay 500ms yang tidak mengganggu UX
Backward compatible: Tidak mengubah API atau struktur data, hanya mengubah timing request

Masalah Terkait (Related Issue)

Langkah untuk mereproduksi (Steps to Reproduce)

Sebelum perbaikan (masalah):

  1. Buka halaman yang menggunakan DataTable (misal: daftar penduduk, daftar keluarga)
  2. Ketik kata pencarian "kemiri" di kolom search DataTable
  3. Perhatikan Network tab di browser DevTools
  4. ❌ Terjadi 6+ request untuk setiap karakter yang diketik ("k", "ke", "kem", "kemi", "kemir", "kemiri")
  5. ❌ Saat menghapus karakter, juga terjadi request untuk setiap karakter yang dihapus

Setelah perbaikan (fix):

  1. Buka halaman yang menggunakan DataTable
  2. Ketik kata pencarian "kemiri" di kolom search DataTable
  3. Perhatikan Network tab di browser DevTools
  4. ✅ Hanya terjadi 1 request setelah user berhenti mengetik selama 500ms
  5. ✅ Saat menghapus karakter, request hanya terjadi setelah user berhenti menghapus selama 500ms

Testing pada fitur lain yang terkait:

  • Pagination DataTable ✅ Tidak terpengaruh
  • Sorting DataTable ✅ Tidak terpengaruh
  • Filter custom (jika ada) ✅ Tidak terpengaruh
  • Export data ✅ Tidak terpengaruh

Daftar Periksa (Checklist)

Teknis Detail

Penjelasan Teknis

Implementasi debounce menggunakan pola standar JavaScript dengan setTimeout dan clearTimeout:

$(document).on('init.dt', function(e, settings) {
    var table = new $.fn.dataTable.Api(settings);
    var searchDelay = table.init().searchDelay || 1500; // fallback 1500ms
    var searchInput = $('div.dataTables_filter input', table.table().container());
    var debounceTimer = null;
    var previousSearch = null;

    // Hapus handler default DataTable
    searchInput.off('keyup.DT input.DT search.DT keydown.DT');

    // Tambah handler custom dengan debounce
    searchInput.on('keyup input', function() {
        var currentValue = this.value;

        // Skip jika nilai tidak berubah
        if (previousSearch === currentValue) return;

        previousSearch = currentValue;
        clearTimeout(debounceTimer);

        debounceTimer = setTimeout(function() {
            if (table.search() !== currentValue) {
                table.search(currentValue).draw();
            }
        }, searchDelay);
    });
});

Mekanisme kerja:

  1. Event init.dt dipanggil setiap kali DataTable diinisialisasi
  2. Handler default DataTable dihapus untuk mencegah request langsung
  3. Handler custom ditambahkan dengan debounce timer (default 500ms dari searchDelay)
  4. Variable previousSearch mencegah redundant search jika nilai tidak berubah
  5. clearTimeout membatalkan timer sebelumnya saat user masih mengetik
  6. table.search().draw() hanya dipanggil setelah timer selesai (user berhenti mengetik)

Optimasi tambahan:

  • searchDelay: 500 di-set sebagai default global untuk semua DataTable
  • Fallback 1500ms jika searchDelay tidak ditemukan di init config
  • Cek table.search() !== currentValue mencegah draw ulang jika nilai sudah sama

Konfigurasi yang berubah

  • searchDelay: 500 ditambahkan ke $.fn.dataTable.defaults

Dependencies yang ditambahkan

  • Tidak ada dependencies baru

Testing

Manual Testing

  • Ketik kata pendek (3-5 karakter) di search DataTable, pastikan hanya 1 request di Network tab
  • Ketik kata panjang (10+ karakter), pastikan hanya 1 request setelah berhenti mengetik
  • Hapus karakter satu per satu, pastikan hanya 1 request setelah berhenti menghapus
  • Ketik lalu langsung hapus semua, pastikan tidak ada request yang tersisa
  • Test di berbagai halaman yang menggunakan DataTable (penduduk, keluarga, dll)
  • Pastikan hasil pencarian tetap akurat setelah debounce
  • Regression Testing - test fitur lain di DataTable (pagination, sorting) tidak rusak

Screenshots / Video

simplescreenrecorder-2026-05-19_15.32.43.mp4

Sebelum:

Network tab menunjukkan multiple request untuk setiap keystroke saat mengetik "kemiri":

  • Request 1: search="k"
  • Request 2: search="ke"
  • Request 3: search="kem"
  • Request 4: search="kemi"
  • Request 5: search="kemir"
  • Request 6: search="kemiri"

Sesudah:

Network tab menunjukkan hanya 1 request setelah user selesai mengetik:

  • Request 1: search="kemiri" (setelah 500ms tidak ada input baru)

Breaking Changes

Tidak ada breaking changes. Perubahan hanya mempengaruhi timing request, bukan fungsi atau API.

Migration Guide

Tidak diperlukan.

References


Catatan tambahan:

  • Default debounce delay diset 500ms, nilai ini bisa disesuaikan jika diperlukan dengan mengubah searchDelay di $.fn.dataTable.defaults
  • Implementasi ini berlaku global untuk semua DataTable di aplikasi karena didefinisikan di layout utama (index.blade.php)

@pandigresik pandigresik requested a review from affandii06 May 19, 2026 08:38
@github-actions
Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1042

@affandii06 affandii06 merged commit e3c1254 into rilis-dev May 20, 2026
@affandii06 affandii06 deleted the feat/datatable_debounce branch May 20, 2026 03:32
affandii06 added a commit that referenced this pull request May 22, 2026
* Fix/detail statistik pangan tidak tampil (#989)

* fix: data detail statistik tidak tampil

* fix: perbaikan detail presisi statistik pangan

* fix: perbaikan detail presisi statistik pangan

* Tambahkan test

* hapus

* fix: tambahkan link detail untuk belum mengisi, jumlah dan total agar seragam

* perbaikan judul

* perbaikan filter tahun

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Feat: detail statistik presisi sandang (#1014)

* fix: data detail statistik tidak tampil

* fix: perbaikan detail presisi statistik pangan

* fix: perbaikan detail presisi statistik pangan

* Tambahkan test

* hapus

* fix: tambahkan link detail untuk belum mengisi, jumlah dan total agar seragam

* feat: detail statistik sandang

* perbaikan sesuai rekomendasi AI review

* perbaiki test

* perbaikan judul

* perbaikan test

* perbaikan filter tahun

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request Feat: detail statistik papan (#1016)

* simpan dulu

* feat: detail presisi papan

* tambahkan test

* perbaikan mengikuti rekomendasi AI review

* perbaikan filter tahun

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From feat: detail statistik pendidikan (#1017)

* feat: detail statistik pendidikan

* perbaikan sesuai rekomendasi AI review

* perbaikan test

* perbaikan filter tahun

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From Feat: detail statistik ketenagakeerjaan (#1019)

* simpan dulu

* feat: detail  statistik ketenagakerjaan

* perbaikan filter tahun

* perbaikan filter tahun

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From feat: detail statistik keagamaan (#1020)

* feat: detail statistik keagamaan

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From fix: tinymce pada artikel (#1022)

* fix: tinymce pada artikel

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From fix: error ketika halaman login menampilkan captcha (#1024)

* fix: error ketika halaman login menampilkan captcha

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From Validasi kategori artikel ketika membuat artikel baru (#1027)

* validasi kategori artikel ketika membuat artikel baru

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From Fix: ijinkan upload video pada tinymce (#1029)

* fix: tinymce pada artikel

* fix: ijinkan upload video pada tinymce

* allow tag video

* perbaikan config

* upgrade versi tinymce

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From Perbaiki tekan enter di form kategori membuat refresh halaman (#1028)

* perbaiki tekan enter membuat refresh halaman

* sesuaikan label aksi tertukar di tabel kategori

* perbaiki tombol simpan melalui cursor

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From Validasi kategori artikel ketika membuat artikel cms baru (#1035)

* Validasi kategori artikel ketika membuat artikel cms baru

* test

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Feat/detail statistik jaminan sosial (#1030)

* feat: Detail statistik Jaminan Sosial

* simpan dulu

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From feat: detail statistik kesehatan (#1034)

* feat: detail kesehatan

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From feat: detail statistik seni (#1036)

* feat: detail statistik seni

* perbaikan judul

* tambahkan judul

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From fix: gambar logo desa pada website desa aktif (#1038)

* fix: gambar logo desa pada website desa aktif

* fix: gambar logo desa pada website desa aktif

* ikuti rekomendasi AI review

* perbaiki test

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From fix: perbaikan tampilan website ketika slider belum diisi (#1040)

* fix: perbaikan tampilan website ketika slider belum diisi

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* Merge Pull Request From feat: datatable debounce (#1042)

* feat: datatable debounce

* [ci skip] memutahirkan catatan rilis

---------

Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>

* rilis v2605.0.1

---------

Co-authored-by: ahmad afandi <ahmad.afandi85@gmail.com>
Co-authored-by: Ahmad Affandi <caspianp98@yahoo.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants