Dalam tutorial sebelumnya sudah dijelaskan mengenai CRUD Fetch API dan CRUD Tanpa API di JavaScript. Dan dalam tutorial kali ini kita akan bahas tentang CRUD JavaScript dengan Pencarian, Sorting, dan Pagination. Karena setelah dapat membuat aplikasi CRUD dasar, tantangan berikutnya adalah mengelola banyak data agar pengguna bisa:
-
Mencari data dengan cepat
-
Mengurutkan berdasarkan kolom tertentu
-
Membagi halaman (pagination) agar tampilan tetap ringan
Ketiga fitur ini membuat aplikasi kamu terasa seperti dashboard profesional, mirip dengan sistem manajemen data di admin panel modern.
Struktur HTML
Gunakan struktur dasar berikut untuk tabel data dan area kontrol:
<h2>Manajemen Produk</h2>
<input type="text" id="search" placeholder="Cari produk...">
<table border="1" cellpadding="8">
<thead>
<tr>
<th onclick="sortTable('name')">Nama Produk ⬍</th>
<th onclick="sortTable('price')">Harga ⬍</th>
</tr>
</thead>
<tbody id="tableBody"></tbody>
</table>
<div id="pagination"></div>
<script src="app.js"></script>
Data dan Variabel Dasar
Buat file app.js dan siapkan data dummy (bisa juga dari LocalStorage):
let products = [
{ name: "Kopi Arabica", price: 45000 },
{ name: "Teh Hijau", price: 30000 },
{ name: "Coklat Bubuk", price: 50000 },
{ name: "Kopi Robusta", price: 40000 },
{ name: "Gula Aren", price: 20000 },
{ name: "Susu Kental Manis", price: 25000 },
{ name: "Krimer", price: 27000 },
{ name: "Kopi Latte", price: 55000 },
{ name: "Matcha", price: 60000 },
{ name: "Cappuccino", price: 52000 }
];
let currentPage = 1;
const itemsPerPage = 4;
let sortDirection = true;
Menampilkan Data ke Tabel (Read + Pagination)
function renderTable(data) {
const tableBody = document.getElementById("tableBody");
tableBody.innerHTML = "";
// Hitung index data untuk pagination
const start = (currentPage - 1) * itemsPerPage;
const end = start + itemsPerPage;
const paginatedData = data.slice(start, end);
paginatedData.forEach((p, i) => {
const row = document.createElement("tr");
row.innerHTML = `
<td>${p.name}</td>
<td>Rp ${p.price.toLocaleString()}</td>
`;
tableBody.appendChild(row);
});
renderPagination(data.length);
}
Fitur Pagination
Tambahkan fungsi untuk menampilkan tombol halaman:
function renderPagination(totalItems) {
const pagination = document.getElementById("pagination");
pagination.innerHTML = "";
const totalPages = Math.ceil(totalItems / itemsPerPage);
for (let i = 1; i <= totalPages; i++) {
const btn = document.createElement("button");
btn.textContent = i;
btn.className = (i === currentPage) ? "active" : "";
btn.onclick = () => {
currentPage = i;
renderTable(filteredProducts);
};
pagination.appendChild(btn);
}
}
Hasilnya: tombol 1, 2, 3… akan muncul otomatis berdasarkan jumlah data.
Fitur Pencarian Data
Tambahkan input pencarian agar pengguna bisa mencari produk berdasarkan nama.
const searchInput = document.getElementById("search");
let filteredProducts = [...products];
searchInput.addEventListener("input", () => {
const keyword = searchInput.value.toLowerCase();
filteredProducts = products.filter(p =>
p.name.toLowerCase().includes(keyword)
);
currentPage = 1;
renderTable(filteredProducts);
});
Cara kerja:
-
Ketika pengguna mengetik di input “Cari produk…”
-
Sistem akan memfilter data
products -
Hanya data yang cocok dengan kata kunci yang ditampilkan
Fitur Sorting (Urutkan Data)
Kamu bisa mengurutkan data berdasarkan kolom “Nama Produk” atau “Harga”:
function sortTable(key) {
filteredProducts.sort((a, b) => {
if (typeof a[key] === "string") {
return sortDirection
? a[key].localeCompare(b[key])
: b[key].localeCompare(a[key]);
} else {
return sortDirection ? a[key] - b[key] : b[key] - a[key];
}
});
sortDirection = !sortDirection;
renderTable(filteredProducts);
}
Penjelasan:
-
sortDirectionmenentukan apakah urut naik atau turun. -
Fungsi
localeCompare()digunakan untuk mengurutkan string (teks). -
Klik header tabel untuk berganti arah sorting.
Styling Tambahan (Opsional)
Tambahkan sedikit CSS agar tabel terlihat profesional:
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 40px auto;
}
#search {
width: 100%;
padding: 8px;
margin-bottom: 15px;
}
table {
width: 100%;
border-collapse: collapse;
}
th {
background: #f4f4f4;
cursor: pointer;
}
th, td {
padding: 10px;
border: 1px solid #ddd;
}
button {
margin: 5px;
padding: 5px 10px;
cursor: pointer;
}
button.active {
background: #007bff;
color: white;
border: none;
}
</style>
Hasil Akhir
Aplikasi sekarang bisa:
-
Menampilkan data produk dengan tabel rapi
-
Menyaring hasil lewat kolom pencarian
-
Mengurutkan data naik/turun dengan klik header
-
Menampilkan data berdasarkan halaman (pagination)
Pengembangan Lanjutan
Kamu bisa mengembangkan fitur ini menjadi aplikasi yang lebih kompleks:
-
Tambahkan form CRUD seperti di tutorial sebelumnya
-
Gunakan LocalStorage agar data tersimpan permanen
-
Tambahkan tombol ekspor ke CSV / Excel
-
Tambahkan indikator sort (▲▼) di header tabel
Kesimpulan
Dengan JavaScript murni (tanpa library), kamu bisa membuat CRUD lengkap dengan pencarian, sorting, dan pagination. Konsep ini penting untuk:
-
Dashboard admin
-
Sistem katalog produk
-
Aplikasi data sederhana
Kunci utamanya: manipulasi array JavaScript dan DOM dinamis.