Build a Bookmark Manager App - Build a Bookmark Manager App

Tell us what’s happening:

The last test is not passing even though it behaves as expected when I try it manually. At least I think so. If there’s anything I’m missing please help me out.
Thanks.
23 - When you click the #delete-bookmark-button, you should delete the bookmark corresponding to the selected radio button and appropriate category from the local storage and update the displayed bookmark list.

Your code so far

/* file: script.js */
const mainSection = document.getElementById("main-section");
const categorySelector = document.getElementById("category-dropdown");
const viewCategoryBtn = document.getElementById("view-category-button");
const addBookmarkBtn = document.getElementById("add-bookmark-button");
//Add Bookmark form section
const formHeading = document.querySelector(".category-name");
const formSection = document.getElementById("form-section");
const newName = document.getElementById("name");
const newUrl = document.getElementById("url");
const goBackFormBtn = document.getElementById("close-form-button");
const addBookmarkFormBtn = document.getElementById("add-bookmark-button-form");
//bookmark list (view category) section
const bookmarkListSection = document.getElementById("bookmark-list-section");
const categoryList = document.getElementById("category-list");
const goBackListBtn = document.getElementById("close-list-button");
const deleteBookmarkBtn = document.getElementById("delete-bookmark-button");

//adding bookmarks to localStorage

const setBookmarks = () => {
  let bookmarks = getBookmarks();
  const bookmark = {};
  bookmark.category = categorySelector.value;
  bookmark.name = newName.value;
  bookmark.url = newUrl.value;
  bookmarks.push(bookmark);
  localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
}

//get bookmarks from localStorage
const getBookmarks = () => {
  try{
  let bookmarkArr = JSON.parse(localStorage.getItem("bookmarks"));
  let validArr;
  bookmarkArr.forEach((bookmarkObj) => {
    let hasName =  Object.hasOwn(bookmarkObj,"name");
    let hasCategory =  Object.hasOwn(bookmarkObj,"category");
    let hasUrl =  Object.hasOwn(bookmarkObj,"url");
    if (hasName && hasCategory && hasUrl) {
      validArr = true; 
    } else {
      validArr = false;
    }
  }); 
  return validArr ? bookmarkArr : [];
  }catch(error){return []}
}

const updateHtml = () => {
  const category = categorySelector.value;
  formHeading.innerText = category;
  const bookmarksArr = getBookmarks();
  const condition = bookmarksArr.some(obj => obj.category === category);
  categoryList.innerHTML = "";
  if (!condition) {
    categoryList.innerHTML = `<p>No Bookmarks Found</p>`;
    return;
  } 
  bookmarksArr.forEach((obj) => {
    if (obj.category === category) {
      categoryList.innerHTML += `<input type="radio" id="${obj.name}" value=${obj.name} name="${category}"/>
      <label for="${obj.name}"><a href="${obj.url}">${obj.name}</a></label>`
    }
  })
}
//display or close form
const displayOrCloseForm = () => {
  formSection.classList.toggle("hidden");
  mainSection.classList.toggle("hidden");
  formHeading.innerText = categorySelector.value;
}

//display of hide "view Category"
const displayOrHideCategory = () => {
  bookmarkListSection.classList.toggle("hidden");
  mainSection.classList.toggle("hidden");
}
//delete selected bookmark
const deleteBookmark = () => {
  let category = categorySelector.value;
  let bookmarkArr = getBookmarks();
  let radioBtns = document.getElementsByName(category);
  for (let i = 0; i < radioBtns.length; i++) {
    if (radioBtns[i].checked) {
       let newBookmarkArr = bookmarkArr.filter(obj => obj.name !== radioBtns[i].value);
       console.log(newBookmarkArr);
       localStorage.setItem("bookmarks", JSON.stringify(newBookmarkArr));
       updateHtml();
       return;
    }
  }
}

addBookmarkBtn.addEventListener("click", displayOrCloseForm);
goBackFormBtn.addEventListener("click", displayOrCloseForm);

addBookmarkFormBtn.addEventListener("click", () => {
  displayOrCloseForm();
  setBookmarks();
  newName.value = "";
  newUrl.value = "";
});

viewCategoryBtn.addEventListener("click", () => {
  displayOrHideCategory();
  updateHtml();
});

goBackListBtn.addEventListener("click", displayOrHideCategory);
deleteBookmarkBtn.addEventListener("click", deleteBookmark);
//console.log(getBookmarks()); 
<!-- file: index.html -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=0.0">
    <title>Bookmark Manager</title>
    <link rel="stylesheet" href="styles.css">
</head>

<body>
    <main>
        <section id="main-section">
            <h1>Bookmark Manager</h1>
            <div id="dropdown">
                <label for="category-dropdown">Select a category:</label>
                <select id="category-dropdown" name="options">
                    <option value="news" selected>News</option>
                    <option value="entertainment">Entertainment</option>
                    <option value="work">Work</option>
                    <option value="miscellaneous">Miscellaneous</option>
                </select>
            </div>
            <div id="buttons">
                <button type="button" id="view-category-button">View Category</button>
                <button type="button" id="add-bookmark-button">Add Bookmark</button>
            </div>
        </section>

        <section id="form-section" class="hidden">
            <form>
                <h2 class="category-name"></h2>
                <div>
                    <label for="name">Name:</label>
                    <input type="text" id="name">
                </div>
                <div>
                    <label for="url">URL:</label>
                    <input type="text" id="url">
                </div>
                <div>
                    <button type="button" id="close-form-button">Go Back</button>
                    <button type="button" id="add-bookmark-button-form">Add Bookmark</button>
                </div>
            </form>
        </section>

        <section id="bookmark-list-section" class="hidden">
            <h2 class="category-name"></h2>
            <div id="category-list">
            </div>
            <div>
                <button type="button" id="close-list-button">Go Back</button>
                <button type="button" id="delete-bookmark-button">Delete Bookmark</button>
            </div>
        </section>

    </main>
    <script src="script.js"></script>
</body>

</html>
/* file: styles.css */

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36

Challenge Information:

Build a Bookmark Manager App - Build a Bookmark Manager App

test the situation in which you have two bookmarks with the same name and different categories, is your app able to delete one but not the other?

1 Like

I understand the issue now. Thank you!!

You’ll also want to make sure your code can handle a bookmark like “Fox News.” Here’s what shows up in Dev Tools > Elements when bookmarks are added for CNN and Fox News.


Notice anything unusual there that would affect how your delete function works?

1 Like

Ah I see the issue. I have to do some string manipulation before creating my innerhtml.
For now all my tests passed after fixing the prior error. Thanks for mentioning this bug.
Ig the tests don’t account for multiple words. Even though I’ll definitely look into it.
Thank You!!