athairrahman53

Untitled

Mar 31st, 2024
1,292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const books = [];
  2. const RENDER_EVENT = "render-books";
  3. const SAVED_STORAGE_KEY = "books";
  4. const SAVED_EVENT = "saved-books";
  5.  
  6. // membuat fungsi untuk melihat localStorage dicukung atau tidak oleh webBrowsur
  7. const isLocalStorageSupport = () => {
  8.   if (typeof Storage === undefined) {
  9.     alert("Browsur kamu tidak mendukung local Storage");
  10.     return false;
  11.   }
  12.   return true;
  13. };
  14.  
  15. // membuat fungsi untuk menyimpan data di localStorage
  16. const booksSave = () => {
  17.   if (isLocalStorageSupport()) {
  18.     const parsed = JSON.stringify(books);
  19.     localStorage.setItem(SAVED_STORAGE_KEY, parsed);
  20.     document.dispatchEvent(new Event(SAVED_EVENT));
  21.   }
  22. };
  23.  
  24. const generateId = () => {
  25.   return +new Date();
  26. };
  27.  
  28. // membuat fungsi untuk menampung data book yang diinput
  29. const inputBookObject = (id, title, author, year, isComplete) => {
  30.   return {
  31.     id,
  32.     title,
  33.     author,
  34.     year,
  35.     isComplete,
  36.   };
  37. };
  38.  
  39. // fungsi untuk melakukan letarasi pada index
  40. const fineBookIndex = (bookId) =>
  41.   books.findIndex((books) => books.id === bookId);
  42.  
  43. // fungsi hapus buku
  44. const removeBookFromReadBook = (bookId) => {
  45.   const bookTarget = fineBookIndex(bookId);
  46.   if (bookTarget === -1) return;
  47.   books.splice(bookTarget, 1);
  48.  
  49.   document.dispatchEvent(new Event(RENDER_EVENT));
  50.   booksSave();
  51. };
  52.  
  53. // fungsi pindahkan buku rak selesai dibaca
  54. const moveBookToCompleted = (bookId) => {
  55.   const bookTarget = fineBookIndex(bookId);
  56.   if (bookTarget === -1) return;
  57.   books[bookTarget].isComplete = true;
  58.   document.dispatchEvent(new Event(RENDER_EVENT));
  59.   booksSave();
  60. };
  61.  
  62. // fungsi untuk mengembalikan buku ke book yang belum selesai;
  63. const backToBookFromReadBook = (bookId) => {
  64.   const bookTarget = fineBookIndex(bookId);
  65.   if (bookTarget === null) return;
  66.   books[bookTarget].isComplete = false;
  67.   document.dispatchEvent(new Event(RENDER_EVENT));
  68.   booksSave();
  69. };
  70.  
  71. //
  72. const updateBook = (bookId) => {
  73.   const bookTarget = fineBookIndex(bookId);
  74.  
  75.   if (bookTarget === -1) return;
  76.  
  77.   const updateTitle = document.getElementById("inputBookTitle").value;
  78.   const updateAuthor = document.getElementById("inputBookAuthor").value;
  79.   const updateYears = document.getElementById("inputBookYear").value;
  80.   const isComplete = document.getElementById("inputBookIsComplete").checked;
  81.  
  82.   books[bookTarget].title = updateTitle;
  83.   books[bookTarget].author = updateAuthor;
  84.   books[bookTarget].year = updateYears;
  85.   books[bookTarget].isComplete = isComplete;
  86.  
  87.   document.dispatchEvent(new Event(RENDER_EVENT));
  88.   booksSave();
  89. };
  90.  
  91. // fungsi untuk mengambil element judul,penulis, tahun, dan ID
  92. const inputDataBooks = () => {
  93.   const isEditing =
  94.     document.getElementById("bookSubmit").innerText === "Edit Buku";
  95.  
  96.   // const generatedID = generateId();
  97.  
  98.   const inputBookId = document.getElementById("inputBookId").value;
  99.   const inputBookTitle = document.getElementById("inputBookTitle").value;
  100.   const inputBookAuthor = document.getElementById("inputBookAuthor").value;
  101.   const inputBookYear = parseInt(
  102.     document.getElementById("inputBookYear").value
  103.   );
  104.   const inputBookIsComplete = document.getElementById(
  105.     "inputBookIsComplete"
  106.   ).checked;
  107.  
  108.   if (isEditing) {
  109.     // const bookIndek = books.findIndex((book) => book.id === generatedID);
  110.     const bookIndek = fineBookIndex(inputBookId);
  111.  
  112.     if (bookIndek !== -1) {
  113.       books[bookIndek].title = inputBookTitle;
  114.       books[bookIndek].author = inputBookAuthor;
  115.       books[bookIndek].year = inputBookYear;
  116.       books[bookIndek].isComplete = inputBookIsComplete;
  117.  
  118.       document.getElementById("bookSubmit").innerText =
  119.         "Masukkan Buku ke rak <span>Belum selesai dibaca</span";
  120.       document.getElementById("cancelEditBtn").style.display = "none";
  121.       booksSave();
  122.  
  123.       // Reset nilai input form
  124.       document.getElementById("inputBookId").value = "";
  125.       document.getElementById("inputBookTitle").value = "";
  126.       document.getElementById("inputBookAuthor").value = "";
  127.       document.getElementById("inputBookYear").value = "";
  128.       document.getElementById("inputBookIsComplete").checked = false;
  129.     }
  130.   } else {
  131.     const generatedID = generateId();
  132.  
  133.     const bookObject = inputBookObject(
  134.       generatedID,
  135.       inputBookTitle,
  136.       inputBookAuthor,
  137.       inputBookYear,
  138.       inputBookIsComplete
  139.     );
  140.  
  141.     books.push(bookObject);
  142.     booksSave();
  143.   }
  144.   document.dispatchEvent(new Event(RENDER_EVENT));
  145. };
  146.  
  147. // fungsi untuk mengload data dari localstorage ketika browsur dibuka kembali
  148. const loadBookFromLocalStorage = () => {
  149.   try {
  150.     const serializedBooks = localStorage.getItem(SAVED_STORAGE_KEY);
  151.     if (serializedBooks === null) {
  152.       return null;
  153.     }
  154.     let parsedBooks = JSON.parse(serializedBooks);
  155.  
  156.     books.push(...parsedBooks);
  157.     booksSave();
  158.     document.dispatchEvent(new Event(RENDER_EVENT));
  159.     return parsedBooks;
  160.   } catch (error) {
  161.     alert("gagal dimuat data buku", error);
  162.     return null;
  163.   }
  164. };
  165.  
  166. //fungsi untuk menemukan id buku seseai dengan yang diingin di edit
  167. const bookFromToEdit = (bookId) => {
  168.   const bookToEdit = fineBookIndex(bookId);
  169.  
  170.   if (bookToEdit === null) return;
  171.  
  172.   document.getElementById("inputBookId").value = books[bookToEdit].id;
  173.   document.getElementById("inputBookTitle").value = books[bookToEdit].title;
  174.   document.getElementById("inputBookAuthor").value = books[bookToEdit].author;
  175.   document.getElementById("inputBookYear").value = books[bookToEdit].year;
  176.   document.getElementById("inputBookIsComplete").checked =
  177.     books[bookToEdit].isComplete;
  178.  
  179.   const bookSubmit = document.getElementById("bookSubmit");
  180.   bookSubmit.innerText = "Simpan";
  181.  
  182.   const updateBookHandler = () => {
  183.     const bookId = books[bookToEdit].id;
  184.     updateBook(bookId);
  185.     bookSubmit.removeEventListener("click", updateBookHandler);
  186.     location.reload(true);
  187.   };
  188.  
  189.   // Remove any existing event listeners before adding a new one
  190.   bookSubmit.removeEventListener("click", updateBookHandler);
  191.  
  192.   bookSubmit.addEventListener("click", updateBookHandler);
  193. };
  194.  
  195. // fungsi untuk menampilkan data buku yang telah diinput
  196. const displayBook = (dataBook, bookId) => {
  197.   const bookTitle = document.createElement("h3");
  198.   bookTitle.innerText = dataBook.title;
  199.  
  200.   const bookWriter = document.createElement("p");
  201.   bookWriter.innerText = dataBook.author;
  202.  
  203.   const bookPublication = document.createElement("p");
  204.   bookPublication.innerText = dataBook.year;
  205.  
  206.   // fungsi untuk membuat button
  207.   const createButton = (text) => {
  208.     const button = document.createElement("Button");
  209.     button.innerText = text;
  210.     button.classList.add("material-symbols-outlined");
  211.     return button;
  212.   };
  213.  
  214.   const clearBook = createButton("delete");
  215.   const finisRead = createButton("done");
  216.   const backButton = createButton("undo");
  217.  
  218.   const editBook = document.createElement("Button");
  219.   editBook.innerText = "edit";
  220.   editBook.classList.add("material-symbols-outlined");
  221.   // menambahkan attribute data-book-id untuk menyimpan ID buku
  222.   editBook.dataset.bookId = bookId;
  223.  
  224.   const action = document.createElement("div");
  225.   action.classList.add("action");
  226.   action.append(clearBook);
  227.  
  228.   if (dataBook.isComplete) {
  229.     action.append(backButton);
  230.     backButton.addEventListener("click", () => {
  231.       backToBookFromReadBook(dataBook.id);
  232.     });
  233.   } else {
  234.     action.append(finisRead, editBook);
  235.     finisRead.addEventListener("click", () => {
  236.       moveBookToCompleted(dataBook.id);
  237.     });
  238.     editBook.addEventListener("click", () => {
  239.       bookFromToEdit(dataBook.id);
  240.     });
  241.   }
  242.   const containerBookItem = document.createElement("article");
  243.   containerBookItem.classList.add("book_item");
  244.   containerBookItem.append(bookTitle, bookWriter, bookPublication);
  245.   containerBookItem.append(action);
  246.   containerBookItem.setAttribute("id", `book-${dataBook.id}`);
  247.  
  248.   clearBook.addEventListener("click", () => {
  249.     Swal.fire({
  250.       title: "Apakah anda yakin?",
  251.       text: "Anda tidak dapat mengembalikan lagi!",
  252.       icon: "warning",
  253.       showCancelButton: true,
  254.       confirmButtonColor: "#3085d6",
  255.       cancelButtonColor: "#d33",
  256.       confirmButtonText: "Ya, hapus saja!",
  257.       cancelButtonText: "Batal",
  258.     }).then((result) => {
  259.       if (result.isConfirmed) {
  260.         removeBookFromReadBook(dataBook.id);
  261.         Swal.fire({
  262.           title: "Terhapus!",
  263.           text: "Buku telah dihapus",
  264.           icon: "success",
  265.         });
  266.       } else {
  267.         Swal.fire({
  268.           title: "Batal!",
  269.           icon: "error",
  270.         });
  271.       }
  272.     });
  273.   });
  274.   return containerBookItem;
  275. };
  276.  
  277. // fungsi untuk mencari judul buku
  278. const searchBookTitle = document.getElementById("searchBookTitle");
  279. searchBookTitle.addEventListener("input", () => {
  280.   const keyword = searchBookTitle.value.toLowerCase();
  281.   const filteredBooks = books.filter((book) =>
  282.     book.title.toLowerCase().includes(keyword)
  283.   );
  284.   renderBooks(filteredBooks);
  285. });
  286.  
  287. // fungsi untuk merender buku pada pencaharian
  288. const renderBooks = (books) => {
  289.   const incompleteBookshelfList = document.getElementById(
  290.     "incompleteBookshelfList"
  291.   );
  292.   incompleteBookshelfList.innerHTML = " ";
  293.  
  294.   const completeBookshelfList = document.getElementById(
  295.     "completeBookshelfList"
  296.   );
  297.   completeBookshelfList.innerHTML = " ";
  298.  
  299.   books.forEach((book) => {
  300.     const bookElement = displayBook(book);
  301.  
  302.     if (book.isComplete) {
  303.       completeBookshelfList.appendChild(bookElement);
  304.     } else {
  305.       incompleteBookshelfList.appendChild(bookElement);
  306.     }
  307.   });
  308. };
  309.  
  310. // membuat event submit untuk melakukan penyimpanan data pada form yang telah diinput
  311. document.addEventListener("DOMContentLoaded", () => {
  312.   const inuputAllDataBook = document.getElementById("inputBook");
  313.   inuputAllDataBook.addEventListener("submit", (e) => {
  314.     e.preventDefault();
  315.     Swal.fire({
  316.       text: "Terkirim",
  317.       icon: "success",
  318.     });
  319.     inputDataBooks();
  320.   });
  321.  
  322.   if (isLocalStorageSupport()) {
  323.     const loadedBooks = loadBookFromLocalStorage();
  324.     if (!loadedBooks) {
  325.       alert("tidak ada buku yang disimpan");
  326.     }
  327.   }
  328. });
  329.  
  330. // Event untuk merender semua data
  331. document.addEventListener(RENDER_EVENT, () => {
  332.   const incompleteBookshelfList = document.getElementById(
  333.     "incompleteBookshelfList"
  334.   );
  335.   incompleteBookshelfList.innerHTML = " ";
  336.  
  337.   const completeBookshelfList = document.getElementById(
  338.     "completeBookshelfList"
  339.   );
  340.   completeBookshelfList.innerHTML = " ";
  341.  
  342.   for (const bookItem of books) {
  343.     const bookElement = displayBook(bookItem);
  344.     if (bookItem.isComplete) {
  345.       completeBookshelfList.append(bookElement);
  346.     } else {
  347.       incompleteBookshelfList.append(bookElement);
  348.     }
  349.   }
  350. });
  351.  
Advertisement
Add Comment
Please, Sign In to add comment