|   | 
| Tampilan Web | 
Desikripsi
  Rent Car Manager adalah website untuk simulasi rental mobil.
  Website ini menggunakan LocalStorage untuk menyimpan data mobil, artinya data
  disimpan di browser dan bisa diakses kembali walaupun user keluar dari web
  tersebut. Di website ini user dapat memanipulasi data mobil dalam LocalStorage
  seperti menambah, edit, dan menghapus. Website ini dibuat menggunakan HTML,
  CSS, dan Javascript.
  Source code dan Live Demo Rent Car Manager bisa diakses di
  Github Repository serta
  Github Pages
  berikut.
Fitur
Sidebar
  Salah satu fitur website ini adalah sidebar yang berfungsi untuk mengakses
  tiap halaman (page) dalam web ini. Sebenarnya struktur utama website terbagi
  menjadi dua, yakni
  <aside>
  untuk bagian sidebar dan
  <main>
  untuk bagian menampilkan konten halaman. Halaman terbuat
  <div>
  yang berada di dalam
  <main>. Untuk menampilkan halaman, hanya perlu memberi 'display block' pada halaman yang ingin ditampilkan lalu 'display none' untuk halaman lainnya. Fungsionalitas tersebut bisa kita implementasikan di
  Javascript lalu kita kaitkan pada
  button yang ada di sidebar.
document.addEventListener('click', function(e) {
    let target = e.target;
    switch (true) {
        // ...
        case target.closest('aside nav button') !== null:
            changePage(target);
            break;
        // ...
    }
});
const buttons = document.querySelectorAll('aside nav button');
function changePage(target) {
    let clickedButton = target.closest('button');
    if (clickedButton) {
        buttons.forEach(btn => {
            btn.classList.remove('active');
        });
        clickedButton.classList.add('active');
        toggleAside();
        showActivePage();
    }
}
const pages = document.querySelectorAll('main > div.mainContent div.page');
function showActivePage() {
    pages.forEach((page, index) => {
        if (buttons[index].classList.contains('active')) {
            page.style.display = 'block';
        } else {
            page.style.display = 'none';
        }
    });
}
showActivePage();
  Kode di atas digunakan untuk menampilkan halaman sesuai
  button yang ditekan. Pertama
  daripada menambahkan 'event listener' untuk setiap button di
  sidebar, kita taruh 'event listener' pada document. Ketika cursor
  menekan sesuatu di website, variabel
  target akan menyimpan elemen
  yang ditekan kemudian melakukan pengecekan menggunakan 'switch statement', jika elemen target sesuai kriteria (contohnya elemen yang ditekan
  merupakan button dengan
  class tertentu) maka akan
  menjalankan suatu kode. Hal ini dinamakan
  document event delegation.
  Kode yang dijalankan berupa function bernama
  changePage(target). Parameter
  target adalah elemen button yang di klik. Function ini bertujuan menambahkan
  class 'active' untuk
  button yang ditekan dan
  menghapus class 'active' di
  button lainnya. Kemudian
  function ini menjalankan dua function lainnya yakni
  toggleAside() (Digunakan nanti
  di Mobile responsive) dan
  showActivePage().
  Function showActivePage() befungsi menampilkan halaman sesuai urutan
  button yang memiliki
  class 'active' karena di HTML
  urutan button dan halaman berkaitan. Contohnya
  button urutan 1 bila diberi
  class 'active' akan menampilkan
  halaman di urutan 1, dan seterusnya. Cara menampilkannya adalah dengan
  memberikan
  'display block' serta
  'display none' untuk
  menyembunyikan halaman lain.
Mobile Responsive
|   | 
| Mobile Sidebar Toggle | 
  Fitur yang dibuat Mobile Responsive di website ini adalah menyembunyikan
  sidebar dan menambahkan navbar untuk mengakses sidebar tersebut. Bisa
  diperoleh menggunakan CSS Media Query, yang berfungsi mengaplikasikan style
  CSS ketika lebar layar device lebih atau kurang dari batas yang telah
  ditentukan.
@media screen and (max-width: 1290px) {
	/* Insert Mobile Styling... */
}
  Untuk menampilkan sidebar, di
  CSS elemen yang berkaitan
  dengan sidebar contohnya
  button di navbar, backdrop
  ketika sidebar dibuka, dan sidebar itu sendiri diberi
  class 'sidebar-open'. Lalu
  tambahkan styling pada elemen yang memiliki
  class 'sidebar-open'. Kemudian
  di Javascript buat function untuk "toggle" pemberian
  class 'sidebar-open' pada
  elemen tersebut.
document.addEventListener('click', function(e) { // document event delegation
    let target = e.target;
    switch (true) {
        case target.closest('.navbar button, button.closeSidebar') !== null:
            toggleAside();
            break;
        // ...
    }
});
function toggleAside() {
    document.querySelector('aside').classList.toggle('sidebar-open');
    document.querySelector('.navbar').classList.toggle('sidebar-open');
    document.querySelector('.backdrop').classList.toggle('sidebar-open');
}
Homepage
|   | 
| Tampilan Homepage | 
Fitur pertama dalam homepage adalah menampilkan waktu (sesuai konfigurasi waktu di device). Caranya menggunakan object Date untuk mendapatkan waktu saat ini dan function bawaan setInterval() untuk menjalankan suatu kode setiap beberapa milidetik.
const tanggalDisplay = document.querySelectorAll('.tanggalDisplay');
function displayDate() {
    let date = new Date;
    let dateFormat = date.toLocaleDateString("id-ID", {
        weekday: 'long',
        year: 'numeric',
        month: 'long',
        day: 'numeric'
    });
    let timeFormat = date.toLocaleTimeString([], { hour12: false });
    tanggalDisplay.forEach(display => 
        display.textContent = `${dateFormat} | ${timeFormat}`
    );
}
displayDate();
setInterval(function() {
    displayDate();
}, 1000);
Fitur selanjutnya adalah menampilkan banyak data mobil dan menampilkan tiap data mobil yang ada di LocalStorage dalam bentuk table. Bisa gunakan javascript untuk memperoleh data dari LocalStorage lalu hitung berapa banyak data tersebut menggunakan method '.length'. Untuk table sendiri, bisa membuat function untuk iterasi setiap data yang ada di LocalStorage lalu setiap data yang diiterasi dimasukkan ke dalam <td> (table data/table cells) kemudian <tr> (table row) dan terakhir ditambahkan ke elemen table tersebut.
function saveLocalStorage(key, data) { // function menyimpan data ke LocalStorage
    localStorage.setItem(key, JSON.stringify(data));
}
function retrieveLocalStorage(key) { // function mendapat data dari LocalStorage
    const data = localStorage.getItem(key);
    return data ? JSON.parse(data) : [];
}
// ...
function updateDataTotalTable(data) { // Function menampilkan jumlah data mobil
    // ...
}
function generateDatabaseTable(data) { // Function membuat rows data pada table
    // ...
}
function renderHomeTable(data) { // function render jumlah data dan table
    // ...
}
|   | 
| Button LocalStorage | 
  Di bawah table terdapat dua
  button. Pertama berfungsi
  menambahkan 'dummy data' (data palsu) ke dalam
  LocalStorage dan yang kedua
  menghapus semua data di
  LocalStorage. Fungsionalitas
  button pertama bisa diraih
  dengan cara retrieve data dari
  LocalStorage kemudian data
  LocalStorage digabung
  (concatenation) dengan dummy data yang telah dibuat. Untuk
  button kedua bisa menggunakan method
  localStorage.removeItem().
const DummyCarsData = [
    { name: "Toyota Camry", status: "available", type: "Sedan", price: 700000, img: "https://www.motortrend.com/uploads/sites/10/2021/02/2021-toyota-camry-se-sedan-angular-front.png" },
    // ...
    { name: "M1 Abrams", status: "booked", type: "Other", price: 66981960000, img: "https://upload.wikimedia.org/wikipedia/commons/b/b9/Abrams-transparent.png", user:{fullname: "Rahmat", email: "pentagon@gov.us", tel: "+1 273 1935", date: ["2001-10-29","2001-11-11"], driver: false, totalDays: "13 Hari", totalPrice: 870765480000} }
];
// ...
function addDummyData() { // menambahkan dummy data
    let data = retrieveLocalStorage('carData');
    let addedData = [...data, ...DummyCarsData];
    saveLocalStorage('carData', addedData);
    renderEverything();
}
function clearLocalStorage() { // hapus semua data di LocalStorage
    localStorage.removeItem('carData');
    renderEverything();
}
Rent Car Page
|   | 
| Tampilan Rent Car | 
    Rent Car adalah salah satu halaman yang berfungsi menampilkan mobil yang
    berstatus "tersedia" atau "available" di data LocalStorage. Mobil
    yang berstatus "available" bisa disewa oleh user dan setelah disewa
    akan berstatus "booked". Selain itu di halaman ini user bisa menambah
    mobil baru dan mengedit data mobil.
  
  
    Setiap list mobil di-generate di dalam Javascript. Lalu setelah di-generate,
    setiap mobil dimasukkan ke dalam halaman (page) sesuai dengan status mobil
    tersebut. Berikut kode javascriptnya.
  
function generateCarCard(data, index) {
    // ...
    return cardDiv;
}
const availableCarList = document.querySelector('.availableCarList');
const bookedCarList = document.querySelector('.bookedCarList');
const unavailableCarList = document.querySelector('.unavailableCarList');
function renderCarList(data) {
    [availableCarList, bookedCarList, unavailableCarList].forEach(list => list.innerHTML = ''); // Clear Cards
    data.forEach((car, index) => {
        const carCard = generateCarCard(car, index);
        switch (car.status) {
            case 'available':
                availableCarList.appendChild(carCard);
                break;
            case 'booked':
                bookedCarList.appendChild(carCard);
                break;
            case 'unavailable':
                unavailableCarList.appendChild(carCard);
                break;
            default:
                console.error(`Unknown status: ${car.status}`);
        }
    });
}
    Klik button "Tambahkan Mobil
    Baru" akan menampilkan
    <dialog> untuk user menambahkan mobil baru ke data
    LocalStorage.
  
  |   | 
| Dialog menu "Tambahkan Mobil Baru" | 
    Klik icon "pena menulis" untuk mengedit data mobil yang dipilih. Di edit
    <dialog>
    user bisa mengubah nama, harga, link gambar, dan status mobil. Selain itu
    user juga bisa menghapus data mobil dari
    LocalStorage dengan menekan
    button "Hapus Mobil".
  
  |   | 
| Dialog Menu "Edit Data Mobil" | 
    Klik button "Sewa mobil" untuk menyewa mobil tersebut. Kemudian akan
    ditampilkan
    <dialog>
    yang berisi form pengisian data penyewa. User bisa melihat total harga dan
    hari terkalkulasi secara otomatis.
  
  |   | 
| Dialog menu "Sewa Mobil" | 
Booked Car Page
|   | 
| Tampilan Booked Car | 
    Booked Car adalah halaman untuk menampilkan list data mobil yang berstatus
    "booked" atau "disewa". Di halaman ini user dapat melihat berapa
    banyak mobil yang tersewa dan melihat detail penyewa dengan menekan
    button "Detail Mobil".
  
  |   | 
| Dialog "Detail Mobil" | 
    Akan muncul
    <dialog>
    yang memperlihatkan semua detail mobil, penyewa, tanggal, dan harga. User
    bisa menekan
    button "Kembalikan Mobil"
    untuk mengembalikan mobil kembali ke status "available".
    
  Unavailable Car Page
|   | 
| Tampilan Unavailable Car | 
    Unavailable Car adalah halaman untuk menampilkan list data mobil yang
    berstatus "unavailable" atau "tidak tersedia". Di halaman ini user
    dapat mengedit data mobil dengan menekan icon "pena menulis" atau ubah
    status kembali ke "available" dengan menekan
    button "Set Status
    Available".
  
  Rental History
|   | 
| Tampilan Rental History | 
    Rental History adalah halaman untuk menampilkan perubahan yang terjadi pada
    data mobil di LocalStorage.
    Perubahan mencakup penambahan mobil baru, edit data, pengapusan, dan
    perubahan status data mobil. Perlu diingat bahwa history catatan
    tidak disimpan secara permanen, jadi jika user keluar dari web,
    history akan ter-reset.
  
  
    Berikut kode Javascript untuk menambahkan rows ke table
    history. Kode ini merupakan function yang mengambil dua parameter,
    yakni status atau pesan
    perubahan (contohnya "Added", "Deleted", dll) dan
    name yakni nama mobil
    tersebut.
  
  
const historyTableTBODY = document.querySelector('.historyTable tbody');
function addHistory(status, name) {
    let tr = document.createElement('tr');
    let tdNo = document.createElement('td');
    tdNo.textContent = historyTableTBODY.children.length + 1;
    let tdNama = document.createElement('td');
    tdNama.textContent = name;
    let tdStatus = document.createElement('td');
    tdStatus.textContent = status;
    let tdWaktu = document.createElement('td');
    let currentTime = new Date;
    currentTime = currentTime.toLocaleTimeString([], { hour12: false })
    tdWaktu.textContent = currentTime;
    [tdNo, tdNama, tdStatus, tdWaktu].forEach(td => tr.appendChild(td));
    historyTableTBODY.appendChild(tr);
}
 
 
0 Komentar