mirror of
https://github.com/cse110-fa22-group29/cse110-fa22-group29.git
synced 2024-11-10 05:34:44 +00:00
Merge branch 'sprint-1' of https://github.com/cse110-fa22-group29/cse110-fa22-group29 into sprint-1
This commit is contained in:
commit
23c29e80bc
@ -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;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user