mirror of
				https://github.com/cse110-fa22-group29/cse110-fa22-group29.git
				synced 2025-10-30 19:46:49 +00:00 
			
		
		
		
	Merge branch 'sprint-1' of https://github.com/cse110-fa22-group29/cse110-fa22-group29 into sprint-1
This commit is contained in:
		| @@ -73,10 +73,10 @@ | |||||||
|         Restaurant: |         Restaurant: | ||||||
|         <input type="text" id="restaurant" name="restaurant" required> |         <input type="text" id="restaurant" name="restaurant" required> | ||||||
|       </label> |       </label> | ||||||
|       <label for="tags"> |       <label for="tag-form"> | ||||||
|         Tags: |         Tags: | ||||||
|         <input type="text" id="tags" name="tags" required> |         <input type="text" id="tag-form" name="tag-form" required> | ||||||
|         <div id="tag-container"> |         <div class='tag-container' id="tag-container-form"> | ||||||
|  |  | ||||||
|         </div> |         </div> | ||||||
|         <button type="button" id="tagAdd">Add Tag</button> |         <button type="button" id="tagAdd">Add Tag</button> | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ | |||||||
|   "name": "food-journal", |   "name": "food-journal", | ||||||
|   "version": "1.0.0", |   "version": "1.0.0", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "test": "mocha --recursive **/*.test.js", |     "test": "mocha --recursive './{,!(node_modules)/**}/*.test.js'", | ||||||
|     "lint": "eslint **/*.js", |     "lint": "eslint **/*.js", | ||||||
|     "fix-style": "eslint --fix **/*.js" |     "fix-style": "eslint --fix '**/*.js'" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "eslint": "^8.27.0", |     "eslint": "^8.27.0", | ||||||
|   | |||||||
| @@ -102,6 +102,7 @@ class ReviewCard extends HTMLElement { | |||||||
|    *                          "mealName": "string", |    *                          "mealName": "string", | ||||||
|    *                          "restaurant": "string", |    *                          "restaurant": "string", | ||||||
|    *                          "rating": number |    *                          "rating": number | ||||||
|  |    *                          "tags": string array | ||||||
|    *                        } |    *                        } | ||||||
|    */ |    */ | ||||||
|   set data(data) { |   set data(data) { | ||||||
| @@ -138,10 +139,21 @@ class ReviewCard extends HTMLElement { | |||||||
|     div.append(span1); |     div.append(span1); | ||||||
|     div.append(img2); |     div.append(img2); | ||||||
|  |  | ||||||
|  |     //added tags | ||||||
|  |     let tagContainer = document.createElement('div') | ||||||
|  |     tagContainer.setAttribute('class', 'tag-container'); | ||||||
|  |     for (let i = 0; i < data['tags'].length; i++) { | ||||||
|  |       let newTag = document.createElement('p'); | ||||||
|  |       newTag.setAttribute('class','tag'); | ||||||
|  |       newTag.innerHTML = data['tags'][i] | ||||||
|  |       tagContainer.append(newTag) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     articleEl.append(img1) |     articleEl.append(img1) | ||||||
|     articleEl.append(pMeal) |     articleEl.append(pMeal) | ||||||
|     articleEl.append(pRestaurant) |     articleEl.append(pRestaurant) | ||||||
|     articleEl.append(div) |     articleEl.append(div) | ||||||
|  |     articleEl.append(tagContainer) | ||||||
|  |  | ||||||
|  |  | ||||||
|   } |   } | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								source/assets/scripts/localStorage.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								source/assets/scripts/localStorage.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | // | ||||||
|  | //module.exports = {getReviewsFromStorage, saveReviewsToStorage}; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @returns {Array<Object>} An array of reviews found in localStorage | ||||||
|  |  */ | ||||||
|  | export function getReviewsFromStorage() { | ||||||
|  | 	let result = JSON.parse(localStorage.getItem('reviews')) | ||||||
|  | 	if (result) { | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | 	return new Array(0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Takes in an array of reviews, converts it to a string, and then | ||||||
|  |  * saves that string to 'reviews' in localStorage | ||||||
|  |  * @param {Array<Object>} reviews An array of reviews | ||||||
|  |  */ | ||||||
|  | export function saveReviewsToStorage(reviews) { | ||||||
|  | 	localStorage.setItem('reviews', JSON.stringify(reviews)); | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								source/assets/scripts/localStorage.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								source/assets/scripts/localStorage.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | const {getReviewsFromStorage, saveReviewsToStorage} = require("./localStorage"); | ||||||
|  | const {environment} = require("./testenv"); | ||||||
|  | const assert = require("assert"); | ||||||
|  | const {describe, it, beforeEach} = require("mocha"); | ||||||
|  |  | ||||||
|  | beforeEach(() => { | ||||||
|  | 	window = environment(); | ||||||
|  | 	localStorage = window.localStorage; | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | describe("test app localStorage interaction", () => { | ||||||
|  | 	it("get after init", () => { | ||||||
|  | 		assert.deepEqual(getReviewsFromStorage(), []); | ||||||
|  | 	}); | ||||||
|  | 	it("store one then get", () => { | ||||||
|  | 		let reviews = [{ | ||||||
|  | 			"imgSrc": "sample src", | ||||||
|  | 			"imgAlt": "sample alt", | ||||||
|  | 			"mealName": "sample name", | ||||||
|  | 			"restaurant": "sample restaurant", | ||||||
|  | 			"rating": 5, | ||||||
|  | 			"tags": ["tag 1", "tag  2", "tag 3"] | ||||||
|  | 		}]; | ||||||
|  |  | ||||||
|  | 		saveReviewsToStorage(reviews); | ||||||
|  | 		assert.deepEqual(getReviewsFromStorage(), reviews); | ||||||
|  | 	}); | ||||||
|  | 	it("repeated store one more and get", () => { | ||||||
|  | 		saveReviewsToStorage(reviews); | ||||||
|  | 		assert.deepEqual(getReviewsFromStorage(), reviews); | ||||||
|  |  | ||||||
|  | 		for(let i = 0; i < 1000; i++){ | ||||||
|  | 			reviews = getReviewsFromStorage(); | ||||||
|  | 			 | ||||||
|  | 			reviews.push( | ||||||
|  | 				{ | ||||||
|  | 					"imgSrc": `sample src ${i}`, | ||||||
|  | 					"imgAlt": `sample alt ${i}`, | ||||||
|  | 					"mealName": `sample name ${i}`, | ||||||
|  | 					"restaurant": `sample restaurant ${i}`, | ||||||
|  | 					"rating": i, | ||||||
|  | 					"tags": [`tag ${3*i}`, `tag ${3*i + 1}`, `tag ${3*i + 2}`] | ||||||
|  | 				} | ||||||
|  | 			) | ||||||
|  | 			saveReviewsToStorage(reviews); | ||||||
|  | 			assert.deepEqual(getReviewsFromStorage(), reviews); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }); | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| // main.js | // main.js | ||||||
|  | import {getReviewsFromStorage, saveReviewsToStorage} from './localStorage.js'; | ||||||
|  |  | ||||||
| // Run the init() function when the page has loaded | // Run the init() function when the page has loaded | ||||||
| window.addEventListener('DOMContentLoaded', init); | window.addEventListener('DOMContentLoaded', init); | ||||||
| @@ -12,17 +13,6 @@ function init() { | |||||||
|   initFormHandler(); |   initFormHandler(); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @returns {Array<Object>} An array of reviews found in localStorage |  | ||||||
|  */ |  | ||||||
| function getReviewsFromStorage() { |  | ||||||
|   let result = JSON.parse(localStorage.getItem('reviews')) |  | ||||||
|   if (result) { |  | ||||||
|     return result; |  | ||||||
|   } |  | ||||||
|   return new Array(0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @param {Array<Object>} reviews An array of reviews |  * @param {Array<Object>} reviews An array of reviews | ||||||
|  */ |  */ | ||||||
| @@ -36,28 +26,21 @@ function addReviewsToDocument(reviews) { | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Takes in an array of reviews, converts it to a string, and then |  | ||||||
|  * saves that string to 'reviews' in localStorage |  | ||||||
|  * @param {Array<Object>} reviews An array of reviews |  | ||||||
|  */ |  | ||||||
| function saveReviewsToStorage(reviews) { |  | ||||||
|   localStorage.setItem('reviews', JSON.stringify(reviews)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Adds the necesarry event handlers to <form> and the clear storage |  * Adds the necesarry event handlers to <form> and the clear storage | ||||||
|  * <button>. |  * <button>. | ||||||
|  */ |  */ | ||||||
| function initFormHandler() { | function initFormHandler() { | ||||||
|   let tagContainer = document.getElementById('tag-container'); |   //accessing form components | ||||||
|  |   let tagContainer = document.getElementById('tag-container-form'); | ||||||
|   let theForm = document.querySelector('form') |   let theForm = document.querySelector('form') | ||||||
|   let submitButt = document.querySelector('button[type="submit"]') |   let submitButt = document.querySelector('button[type="submit"]') | ||||||
|  |    | ||||||
|   submitButt.addEventListener('click', function(){ |   submitButt.addEventListener('click', function(){ | ||||||
|     let deleteTags = document.querySelectorAll('.tag') |     /* | ||||||
|     for(let i = 0; i < deleteTags.length; i ++) { |     *  User submits the form for their review. | ||||||
|       tagContainer.removeChild(deleteTags[i]); |     *  We create reviewCard and put in storage | ||||||
|     } |     */ | ||||||
|     let formData = new FormData(theForm); |     let formData = new FormData(theForm); | ||||||
|     let reviewObject = {} |     let reviewObject = {} | ||||||
|     for (let [key, value] of formData) { |     for (let [key, value] of formData) { | ||||||
| @@ -65,7 +48,14 @@ function initFormHandler() { | |||||||
|       console.log(`${value}`) |       console.log(`${value}`) | ||||||
|       reviewObject[`${key}`] = `${value}` |       reviewObject[`${key}`] = `${value}` | ||||||
|     } |     } | ||||||
|     //console.log(reviewObject) |     reviewObject['tags'] = [] | ||||||
|  |  | ||||||
|  |     let deleteTags = document.querySelectorAll('.tag') | ||||||
|  |     for(let i = 0; i < deleteTags.length; i ++) { | ||||||
|  |       reviewObject['tags'].push(deleteTags[i].innerHTML); | ||||||
|  |       tagContainer.removeChild(deleteTags[i]); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |  | ||||||
|     let newReview = document.createElement('review-card') |     let newReview = document.createElement('review-card') | ||||||
|     newReview.data = reviewObject |     newReview.data = reviewObject | ||||||
| @@ -97,10 +87,9 @@ function initFormHandler() { | |||||||
|       |       | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   //allowing for tags selection/creation for user's review card |  | ||||||
|   let tagAddButton = document.getElementById('tagAdd'); |   let tagAddButton = document.getElementById('tagAdd'); | ||||||
|   tagAddButton.addEventListener('click', ()=> { |   tagAddButton.addEventListener('click', ()=> { | ||||||
|     let tagField = document.getElementById('tags'); |     let tagField = document.getElementById('tag-form'); | ||||||
|     if (tagField.value.length > 0) { |     if (tagField.value.length > 0) { | ||||||
|       let p = document.createElement('p'); |       let p = document.createElement('p'); | ||||||
|       p.innerHTML = tagField.value; |       p.innerHTML = tagField.value; | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								source/assets/scripts/testenv.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								source/assets/scripts/testenv.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | module.exports = {environment}; | ||||||
|  |  | ||||||
|  | function environment () { | ||||||
|  | 	const localStorageMock = (function () { | ||||||
|  | 		let store = {}; | ||||||
|  | 		return { | ||||||
|  | 			getItem(key) { | ||||||
|  | 				return store[key]; | ||||||
|  | 			}, | ||||||
|  | 			setItem(key, value) { | ||||||
|  | 				store[key] = value; | ||||||
|  | 			}, | ||||||
|  | 			clear() { | ||||||
|  | 				store = {}; | ||||||
|  | 			}, | ||||||
|  | 			removeItem(key) { | ||||||
|  | 				delete store[key]; | ||||||
|  | 			}, | ||||||
|  | 			getAll() { | ||||||
|  | 				return store; | ||||||
|  | 			}, | ||||||
|  | 		}; | ||||||
|  | 	})(); | ||||||
|  |  | ||||||
|  | 	let window = {}; | ||||||
|  | 	Object.defineProperty(window, "localStorage", { value: localStorageMock }); | ||||||
|  | 	return window; | ||||||
|  | } | ||||||
| @@ -4,13 +4,16 @@ | |||||||
|       "imgAlt": "tacos pic", |       "imgAlt": "tacos pic", | ||||||
|       "mealName": "Birria Tacos", |       "mealName": "Birria Tacos", | ||||||
|       "restaurant": "Mike's Red Tacos", |       "restaurant": "Mike's Red Tacos", | ||||||
|       "rating": 5 |       "rating": 5, | ||||||
|  |       "tags": ["delicious", "#worthit","omg"] | ||||||
|    }, |    }, | ||||||
|    { |    { | ||||||
|       "imgSrc": "https://www.redwormcomposting.com/images/worm-burrito.JPG", |       "imgSrc": "https://www.redwormcomposting.com/images/worm-burrito.JPG", | ||||||
|       "imgAlt": "wolftown pic", |       "imgAlt": "wolftown pic", | ||||||
|       "mealName": "Carnitas Burrito", |       "mealName": "Carnitas Burrito", | ||||||
|       "restaurant": "Wolftown UCSD", |       "restaurant": "Wolftown UCSD", | ||||||
|       "rating": 0 |       "rating": 0, | ||||||
|  |       "tags": ["gross", "why","no"] | ||||||
|  |  | ||||||
|    } |    } | ||||||
| ] | ] | ||||||
| @@ -47,6 +47,11 @@ | |||||||
|     row-gap: 10px; |     row-gap: 10px; | ||||||
|     width: 100%; |     width: 100%; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   .tag-container { | ||||||
|  |     display: flex; | ||||||
|  |     flex-flow: row wrap; | ||||||
|  |   } | ||||||
|   .tag { |   .tag { | ||||||
|   background-color: grey; |   background-color: grey; | ||||||
|   border-radius: 7px; |   border-radius: 7px; | ||||||
| @@ -66,14 +71,14 @@ | |||||||
|   color: white; |   color: white; | ||||||
|   cursor: pointer; |   cursor: pointer; | ||||||
| } | } | ||||||
| .tag:hover::before{ | .tag:hover::before { | ||||||
|   color: red; |   color: red; | ||||||
| } | } | ||||||
|   .danger { | .danger { | ||||||
|     background-color: rgb(254, 171, 171); |   background-color: rgb(254, 171, 171); | ||||||
|     border-color: red; |   border-color: red; | ||||||
|   } | } | ||||||
|  |  | ||||||
|   .hidden { | .hidden { | ||||||
|     display: none; |   display: none; | ||||||
|   } | } | ||||||
		Reference in New Issue
	
	Block a user