From 847e8a1aa1f0e3594a6d2063fe45643aae8ad4d3 Mon Sep 17 00:00:00 2001 From: Kara Hoagland Date: Mon, 28 Nov 2022 18:48:55 -0800 Subject: [PATCH] No tag duplicates --- source/assets/scripts/CreatePage.js | 29 ++++++++------ source/assets/scripts/ReviewDetails.js | 28 ++++++++----- source/assets/scripts/localStorage.js | 55 +++++++++++++------------- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/source/assets/scripts/CreatePage.js b/source/assets/scripts/CreatePage.js index fab6409..e1850f5 100644 --- a/source/assets/scripts/CreatePage.js +++ b/source/assets/scripts/CreatePage.js @@ -3,11 +3,7 @@ import { newReviewToStorage } from "./localStorage.js"; window.addEventListener("DOMContentLoaded", init); function init() { - // get next id - - // creates the key initFormHandler(); - } function initFormHandler() { @@ -91,19 +87,26 @@ function initFormHandler() { }); let tagAddBtn = document.getElementById("tag-add-btn"); + //Set used to track tags and ensure no duplicates + let tagSet = new Set(); tagAddBtn.addEventListener("click", ()=> { let tagField = document.getElementById("tag-form"); if (tagField.value.length > 0) { - let tagLabel = document.createElement("label"); - tagLabel.innerHTML = tagField.value; - tagLabel.setAttribute("class","tag"); - tagLabel.addEventListener("click",()=> { - tagContainer.removeChild(tagLabel); - }); - - tagContainer.append(tagLabel); + if (!tagSet.has(tagField.value.toLowerCase())){ + let tagLabel = document.createElement("label"); + tagLabel.innerHTML = tagField.value; + tagLabel.setAttribute("class","tag"); + tagSet.add(tagField.value.toLowerCase()); + tagLabel.addEventListener("click",()=> { + tagContainer.removeChild(tagLabel); + tagSet.delete(tagField.value.toLowerCase()); + }); + + tagContainer.append(tagLabel); + } else { + window.alert("No duplicate tags allowed"); + } tagField.value = ""; - } }); diff --git a/source/assets/scripts/ReviewDetails.js b/source/assets/scripts/ReviewDetails.js index 7f22679..1f83c82 100644 --- a/source/assets/scripts/ReviewDetails.js +++ b/source/assets/scripts/ReviewDetails.js @@ -1,5 +1,5 @@ //reviewDetails.js -import {addTagsToStorage, deleteReviewFromStorage, deleteTagsFromStorage, getReviewFromStorage, updateReviewToStorage} from "./localStorage.js"; +import {deleteReviewFromStorage, getReviewFromStorage, updateReviewToStorage} from "./localStorage.js"; // Run the init() function when the page has loaded window.addEventListener("DOMContentLoaded", init); @@ -92,16 +92,21 @@ function setupUpdate(){ document.getElementById("s" + `${currReview["rating"]}`).checked = true; document.getElementById("restaurant").defaultValue = currReview["restaurant"]; + //Set used to track tags and ensure no duplicates + let tagSet = new Set(); + if(currReview["tags"]){ while (tagContainer.firstChild) { tagContainer.removeChild(tagContainer.firstChild); } for (let i = 0; i < currReview["tags"].length; i++) { + tagSet.add(currReview["tags"][i].toLowerCase()); let newTag = document.createElement("label"); newTag.setAttribute("class","tag"); newTag.innerHTML = currReview["tags"][i]; newTag.addEventListener("click",()=> { tagContainer.removeChild(newTag); + tagSet.delete(currReview["tags"][i].toLowerCase()); }); tagContainer.append(newTag); } @@ -186,19 +191,24 @@ function setupUpdate(){ }); //adding tag to form functionality - //TODO: disable duplicate tags (use set?) let tagAddBtn = document.getElementById("tag-add-btn"); tagAddBtn.addEventListener("click", ()=> { let tagField = document.getElementById("tag-form"); if (tagField.value.length > 0) { - let tagLabel = document.createElement("label"); - tagLabel.innerHTML = tagField.value; - tagLabel.setAttribute("class","tag"); - tagLabel.addEventListener("click",()=> { - tagContainer.removeChild(tagLabel); - }); + if (!tagSet.has(tagField.value.toLowerCase())){ + let tagLabel = document.createElement("label"); + tagLabel.innerHTML = tagField.value; + tagLabel.setAttribute("class","tag"); + tagSet.add(tagField.value.toLowerCase()); + tagLabel.addEventListener("click",()=> { + tagContainer.removeChild(tagLabel); + tagSet.delete(tagField.value.toLowerCase()); + }); - tagContainer.append(tagLabel); + tagContainer.append(tagLabel); + } else { + window.alert("No duplicate tags allowed"); + } tagField.value = ""; } }); diff --git a/source/assets/scripts/localStorage.js b/source/assets/scripts/localStorage.js index 545f6d5..8ccfe4e 100644 --- a/source/assets/scripts/localStorage.js +++ b/source/assets/scripts/localStorage.js @@ -45,8 +45,8 @@ export function updateReviewToStorage(ID, review){ //Get diff of tags and update storage let deletedTags = oldReview["tags"].filter(x => !review["tags"].includes(x)); let addedTags = review["tags"].filter(x => !oldReview["tags"].includes(x)); - deleteTagsFromStorage(currID, deletedTags); - addTagsToStorage(currID, addedTags); + deleteTagsFromStorage(ID, deletedTags); + addTagsToStorage(ID, addedTags); // set the review entry with ID to the review object localStorage.setItem(`review${ID}`, JSON.stringify(review)); @@ -63,7 +63,6 @@ export function deleteReviewFromStorage(ID){ if (activeIDS[i] == ID) { activeIDS.splice(i,1); localStorage.setItem("activeIDS", JSON.stringify(activeIDS)); - //get review to delete all the tags(may wanna just add ID to a different list that will delete review and tag list in background)(also don't wanna linear search) let currReview = JSON.parse(localStorage.getItem(`review${ID}`)); deleteTagsFromStorage(ID, currReview["tags"]); localStorage.removeItem(`review${ID}`); @@ -79,10 +78,11 @@ export function deleteReviewFromStorage(ID){ * @param {string} ID to delete from lists * @param {string[]} deletedTags to modify storage of */ -export function deleteTagsFromStorage(ID, deletedTags) { +function deleteTagsFromStorage(ID, deletedTags) { for(let i in deletedTags){ //get local storage of each tag and remove id from tag list - let tagArr = JSON.parse(localStorage.getItem("!"+ deletedTags[i])); + let tagName = "!"+ deletedTags[i]; + let tagArr = JSON.parse(localStorage.getItem(tagName.toLowerCase())); for(let j in tagArr){ if(tagArr[j] == ID){ tagArr.splice(j,1); @@ -90,9 +90,9 @@ export function deleteTagsFromStorage(ID, deletedTags) { break; } if(tagArr.length != 0){ - localStorage.setItem("!" + deletedTags[i], JSON.stringify(tagArr)); + localStorage.setItem(tagName.toLowerCase(), JSON.stringify(tagArr)); } else { - localStorage.removeItem("!" + deletedTags[i]); + localStorage.removeItem(tagName.toLowerCase()); } } } @@ -102,34 +102,18 @@ export function deleteTagsFromStorage(ID, deletedTags) { * @param {string} ID to add to lists * @param {string[]} addedTags to modify storage of */ -export function addTagsToStorage(ID, addedTags) { +function addTagsToStorage(ID, addedTags) { for(let i in addedTags){ - let tagArr = JSON.parse(localStorage.getItem("!" + addedTags[i])); + let tagName = "!" + addedTags[i]; + let tagArr = JSON.parse(localStorage.getItem(tagName.toLowerCase())); if(!tagArr){ tagArr = []; } tagArr.push(ID); - localStorage.setItem("!" + addedTags[i], JSON.stringify(tagArr)); + localStorage.setItem(tagName.toLowerCase(), JSON.stringify(tagArr)); } } -// legacy function -export function getAllReviewsFromStorage() { - if (!(localStorage.getItem("activeIDS"))) { - // we wanna init the active ID array and start the nextID count - localStorage.setItem("activeIDS", JSON.stringify([])); - localStorage.setItem("nextID", JSON.stringify(0)); - } - //iterate thru activeIDS - let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); - let reviews = []; - for (let i = 0; i < activeIDS.length; i++) { - let currReview = JSON.parse(localStorage.getItem(`review${activeIDS[i]}`)); - reviews.push(currReview); - } - return reviews; -} - /** * Returns the top n reviews by ID. If there are less than n reviews, returns the most possible. * @param {number} n number of reviews to return @@ -146,4 +130,21 @@ export function getTopReviewsFromStorage(n) { */ export function getReviewsByTag(tag) { +} + +// legacy function +export function getAllReviewsFromStorage() { + if (!(localStorage.getItem("activeIDS"))) { + // we wanna init the active ID array and start the nextID count + localStorage.setItem("activeIDS", JSON.stringify([])); + localStorage.setItem("nextID", JSON.stringify(0)); + } + //iterate thru activeIDS + let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); + let reviews = []; + for (let i = 0; i < activeIDS.length; i++) { + let currReview = JSON.parse(localStorage.getItem(`review${activeIDS[i]}`)); + reviews.push(currReview); + } + return reviews; } \ No newline at end of file