Tujuan Program
Tujuan Program |
Tujuan dari program ini hampir sama dengan Mini Project Table Buah Datastore Modul 8, perbedaannya ada pada penambahan fitur pagination. "Paging" atau "Pagination" adalah proses memisahkan konten ke dalam beberapa halaman terpisah untuk mempermudah navigasi dan mempercepat waktu muat. Pada program ini, pagination digunakan untuk membagi tabel data buah ke dalam beberapa halaman terpisah dengan jumlah item tertentu per halaman.
Tampilan awal program |
Setelah diisi data |
Data pada page berbeda |
Source Code
Source code program ini bisa dilihat di Repository berikut: Source Code Mini Project
Github Repository: Main Repository
Kalian bisa mencoba program ini secara online dengan mengakses link berikut: Github Pages
Github Repository: Main Repository
Kalian bisa mencoba program ini secara online dengan mengakses link berikut: Github Pages
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mini Project 5</title> <link rel="stylesheet" href="style.css"> </head> <body> <h1>Tabel Buah (Pagination)</h1> <form onsubmit="return false;"> <div> <label for="namaBuah">Nama Buah:</label> <input type="text" id="namaBuah" required> </div> <div> <label for="beratBuah">Berat:</label> <input type="number" id="beratBuah" min="0" required> <span>Kg</span> </div> <div> <label for="gambarBuah">Gambar:</label> <input type="text" id="gambarBuah"> </div> <button onclick="addData(); renderData(tableDataStore);">Add</button> </form> <hr> <div id="pagination-container"> <!-- Pagination --> </div> <table> <thead> <tr> <th>No</th> <th>Nama Buah</th> <th>Berat</th> <th>Gambar</th> <th>Action</th> </tr> </thead> <tbody id="tableBuah"> <!-- Data Here --> </tbody> </table> <script src="script.js"></script> </body> </html>
script.js
let namaBuahInput = document.getElementById("namaBuah"); let beratBuahInput = document.getElementById("beratBuah"); let gambarBuahInput = document.getElementById("gambarBuah"); let tableBuah = document.getElementById("tableBuah"); let paginationDiv = document.getElementById('pagination-container'); // ------------------------------------------------------------------------- // let tableDataStore = [ // Data Here ]; // ------------------------------------------------------------------------- // let currentPage = 1; let maxRows = 5; function renderData(data) { tableBuah.innerHTML = ""; let startIndex = (currentPage - 1) * maxRows; let endIndex = startIndex + maxRows; let extractedData = data.slice(startIndex, endIndex); tableBuah.appendChild(generateTable(extractedData)); } function renderPagination(data) { paginationDiv.innerHTML = ""; let totalPages = Math.ceil(data.length / maxRows); for (let i = 1; i <= totalPages; i++) { let pageLink = document.createElement('a'); pageLink.textContent = i; pageLink.setAttribute("onclick", "setPage(this)"); if (i === currentPage) { pageLink.classList.add('active'); } paginationDiv.appendChild(pageLink); } } function setPage(anchorElement) { let pageLink = anchorElement; currentPage = Number(pageLink.textContent); renderAll(tableDataStore); } function generateTable(data) { let tableRows = document.createDocumentFragment(); for (let i = 0; i < data.length; i++) { let tr = document.createElement('tr'); let tdNomorUrut = document.createElement('td'); let tdNama = document.createElement('td'); let tdBerat = document.createElement('td'); let tdGambar = document.createElement('td'); let tdAction = document.createElement('td'); tdNomorUrut.textContent = (currentPage - 1) * maxRows + i + 1; tdNama.textContent = data[i].nama; tdBerat.textContent = data[i].berat; let img = createImg(data[i].gambar); tdGambar.appendChild(img); let editButton = createButton("Edit", "editData(this)") tdAction.appendChild(editButton); let tdArray = [ tdNomorUrut, tdNama, tdBerat, tdGambar, tdAction ] tdArray.forEach(td => tr.appendChild(td)); tableRows.appendChild(tr); } return tableRows; } function renderAll(data) { renderData(data); renderPagination(data); } renderAll(tableDataStore) // ------------------------------------------------------------------------- // function addData() { let newData = { nama: namaBuahInput.value, berat: Number(beratBuahInput.value), gambar: gambarBuahInput.value }; tableDataStore.push(newData); renderAll(tableDataStore); } function editData(button) { let buttonRow = button.closest('tr'); let position = Number(buttonRow.children[0].textContent); let index = position - 1; let nama = tableDataStore[index].nama; let berat = tableDataStore[index].berat; let gambar = tableDataStore[index].gambar; let tdElement = buttonRow.children; let namaInput = createInput("text", nama); let beratInput = createInput("number", berat); let gambarInput = createInput("text", gambar); let deleteData = createButton("Hapus", "deleteData(this)"); let saveData = createButton("Save", "saveData(this)"); let buttonContainer = document.createElement('div'); buttonContainer.appendChild(deleteData); buttonContainer.appendChild(saveData); let inputArray = [ namaInput, beratInput, gambarInput, buttonContainer ] for (let i = 0; i < inputArray.length; i++) { tdElement[i + 1].innerHTML = ''; tdElement[i + 1].appendChild(inputArray[i]); } } function deleteData(button) { let buttonRow = button.closest('tr'); let index = Number(buttonRow.children[0].textContent) - 1; tableDataStore.splice(index, 1); renderAll(tableDataStore); } function saveData(button) { let buttonRow = button.closest('tr'); let index = Number(buttonRow.children[0].textContent) - 1; let nama = buttonRow.getElementsByTagName('input')[0].value; let berat = Number(buttonRow.getElementsByTagName('input')[1].value); let gambar = buttonRow.getElementsByTagName('input')[2].value; tableDataStore[index].nama = nama; tableDataStore[index].berat = berat; tableDataStore[index].gambar = gambar; renderAll(tableDataStore); } // ------------------------------------------------------------------------- // function createInput(inputType, inputValue) { let input = document.createElement("input"); input.setAttribute("type", inputType); if (inputType === "number") { input.setAttribute("min", "1"); } input.value = inputValue; return input; } function createButton(textContent, onclickFunction) { let button = document.createElement("button"); button.textContent = textContent; button.setAttribute("onclick", onclickFunction); return button; } function createImg(src) { let img = document.createElement("img"); img.setAttribute("src", src); img.setAttribute("alt", "Gambar"); img.setAttribute("width", "80px"); return img; }
Pembahasan
Karena hampir mirip dengan Mini Project Table Buah Datastore, di artikel ini hanya menjelaskan perbedaan atau penambahan pada kode.
1. Penambahan div HTML untuk pagination, ditambahkan
div dengan id "pagination-container" yang berguna sebagai
container untuk elemen pagination (anchor element). Kemudian
div tersebut dipanggil dalam Javascript.
<div id="pagination-container"> <!-- Pagination --> </div>
let paginationDiv = document.getElementById('pagination-container');
2. currentPage dan maxRows, buat variabel
currentPage untuk melacak halaman yang sedang ditampilkan oleh
pengguna, dan maxRows menentukan jumlah maksimum baris data yang akan
ditampilkan dalam satu halaman.
let currentPage = 1; let maxRows = 5;
3. Function renderData(data), bertujuan untuk menampilkan data
pada tabel buah sesuai dengan halaman yang sedang aktif. Pertama, function
mengosongkan elemen tableBuah menggunakan innerHTML agar data
sebelumnya dihapus. Selanjutnya, variabel startIndex dan
endIndex digunakan untuk menentukan rentang data yang akan ditampilkan
berdasarkan halaman saat ini dan jumlah maksimum baris per halaman
(maxRows). Kemudian, function memanggil generateTable() dengan
parameter data yang sudah dipotong sesuai rentang yang ditentukan sebelumnya.
Hasil dari generateTable() akan ditambahkan ke dalam tableBuah.
function renderData(data) { tableBuah.innerHTML = ""; let startIndex = (currentPage - 1) * maxRows; let endIndex = startIndex + maxRows; let extractedData = data.slice(startIndex, endIndex); tableBuah.appendChild(generateTable(extractedData)); }
4. Function renderPagination(data), bertanggung jawab untuk membuat
tautan halaman pada elemen HTML yang menyimpan navigasi pagination. Pertama,
function ini menghapus isi dari elemen pagination (paginationDiv.innerHTML = "";). Selanjutnya, menghitung jumlah halaman yang diperlukan berdasarkan jumlah
data dan jumlah maksimum baris per halaman. Selanjutnya, melakukan iterasi
sebanyak jumlah halaman dan membuat elemen <a> untuk
masing-masing halaman. Jika halaman tersebut merupakan halaman saat ini (if (i === currentPage)), maka tautan diberi kelas 'active' untuk menunjukkan bahwa halaman
tersebut sedang aktif. Semua tautan halaman tersebut ditambahkan ke elemen
paginationDiv.
function renderPagination(data) { paginationDiv.innerHTML = ""; let totalPages = Math.ceil(data.length / maxRows); for (let i = 1; i <= totalPages; i++) { let pageLink = document.createElement('a'); pageLink.textContent = i; pageLink.setAttribute("onclick", "setPage(this)"); if (i === currentPage) { pageLink.classList.add('active'); } paginationDiv.appendChild(pageLink); } }
5. Function renderAll(data), bertanggung jawab untuk merender
ulang seluruh tampilan tabel dan tautan paginasi setiap kali terjadi perubahan
data. Function ini memanggil function renderData(data) untuk merender
ulang tabel data berdasarkan data yang diberikan. Kemudian, function ini
memanggil renderPagination(data) untuk merender ulang tautan halaman
paginasi berdasarkan jumlah total data.
function renderAll(data) {
renderData(data);
renderPagination(data);
}
6. Function setPage(anchorElement), bertujuan untuk
menetapkan halaman yang aktif saat pengguna mengklik tautan halaman pada
pagination. Pertama, function ini menerima elemen anchor (a) sebagai
parameter yang menunjukkan tautan halaman yang diklik. Kemudian, dari elemen
tersebut, function mengekstrak nomor halaman yang terkait dan menetapkannya
sebagai nilai variabel currentPage. Setelah itu, function
memanggil renderAll(tableDataStore) untuk merender ulang tabel dan
pagination dengan halaman yang baru.
function setPage(anchorElement) { let pageLink = anchorElement; currentPage = Number(pageLink.textContent); renderAll(tableDataStore); }
End
Jika sudah, kalian bisa mencoba program tersebut dengan mengakses laman ini.
0 Komentar