Merge branch 'main' into add-app-to-readme

This commit is contained in:
Arthur Lu 2022-11-18 01:33:51 -08:00 committed by GitHub
commit 46cee253f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
64 changed files with 2108 additions and 895 deletions

View File

@ -1,33 +1,33 @@
{ {
"env": { "env": {
"browser": true, "browser": true,
"es2021": true, "es2021": true,
"node": true "node": true
}, },
"extends": "eslint:recommended", "extends": "eslint:recommended",
"overrides": [ "overrides": [
], ],
"parserOptions": { "parserOptions": {
"ecmaVersion": "latest", "ecmaVersion": "latest",
"sourceType": "module" "sourceType": "module"
}, },
"rules": { "rules": {
"indent": [ "indent": [
"error", "error",
"tab" "tab"
], ],
"linebreak-style": [ "linebreak-style": [
"error", "error",
"unix" "unix"
], ],
"quotes": [ "quotes": [
"error", "error",
"double" "double"
], ],
"semi": [ "semi": [
"error", "error",
"always" "always"
], ],
"no-global-assign": 0 "no-global-assign": 0
} }
} }

23
.github/workflows/css-linting.yml vendored Normal file
View File

@ -0,0 +1,23 @@
name: CSS Linting
on:
pull_request:
branches:
- main
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
# Single deploy job since we're just deploying
test:
runs-on: ubuntu-latest
steps:
- name: Install apt updates
run: sudo apt -y update; sudo apt -y upgrade;
- name: Checkout
uses: actions/checkout@v3
- name: Install dependencies
run: sudo npm install
- name: Run tests
run: sudo npm run lintCSS

View File

@ -1,43 +1,43 @@
# Simple workflow for deploying static content to GitHub Pages # Simple workflow for deploying static content to GitHub Pages
name: Deploy GitHub Pages name: Deploy GitHub Pages
on: on:
# Runs on pushes targeting the default branch # Runs on pushes targeting the default branch
push: push:
branches: branches:
- main - main
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions: permissions:
contents: read contents: read
pages: write pages: write
id-token: write id-token: write
# Allow one concurrent deployment # Allow one concurrent deployment
concurrency: concurrency:
group: "pages" group: "pages"
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
# Single deploy job since we're just deploying # Single deploy job since we're just deploying
deploy: deploy:
environment: environment:
name: github-pages name: github-pages
url: ${{ steps.deployment.outputs.page_url }} url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup Pages - name: Setup Pages
uses: actions/configure-pages@v2 uses: actions/configure-pages@v2
- name: Upload artifact - name: Upload artifact
uses: actions/upload-pages-artifact@v1 uses: actions/upload-pages-artifact@v1
with: with:
# Upload only the src repository # Upload only the src repository
path: './source/' path: './source/'
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deployment id: deployment
uses: actions/deploy-pages@v1 uses: actions/deploy-pages@v1

23
.github/workflows/html-linting.yml vendored Normal file
View File

@ -0,0 +1,23 @@
name: HTML Linting
on:
pull_request:
branches:
- main
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
# Single deploy job since we're just deploying
test:
runs-on: ubuntu-latest
steps:
- name: Install apt updates
run: sudo apt -y update; sudo apt -y upgrade;
- name: Checkout
uses: actions/checkout@v3
- name: Install dependencies
run: sudo npm install
- name: Run tests
run: sudo npm run lintHTML

View File

@ -1,25 +1,25 @@
name: JS Linting name: JS Linting
on: on:
pull_request: pull_request:
branches: branches:
- main - main
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
jobs: jobs:
# Single deploy job since we're just deploying # Single deploy job since we're just deploying
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Install apt updates - name: Install apt updates
run: sudo apt -y update; sudo apt -y upgrade; run: sudo apt -y update; sudo apt -y upgrade;
- name: Install prerequisites - name: Install prerequisites
run: sudo apt install -y nodejs npm; run: sudo apt install -y nodejs npm;
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install dependencies - name: Install dependencies
run: sudo npm install run: sudo npm install
- name: Run tests - name: Run tests
run: sudo npm run lint run: sudo npm run lint

View File

@ -16,7 +16,9 @@ jobs:
- name: Install apt updates - name: Install apt updates
run: sudo apt -y update; sudo apt -y upgrade; run: sudo apt -y update; sudo apt -y upgrade;
- name: Install prerequisites - name: Install prerequisites
run: sudo apt install -y nodejs npm; uses: actions/setup-node@v3
with:
node-version: 18
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install dependencies - name: Install dependencies

4
.gitignore vendored
View File

@ -1,3 +1,3 @@
**/.devcontainer/* **/.devcontainer/*
**/node_modules/* **/node_modules/*
**/package-lock.json **/package-lock.json

3
.htmlhintrc Normal file
View File

@ -0,0 +1,3 @@
{
"attr-value-not-empty": false
}

3
.stylelintrc.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "stylelint-config-standard"
}

View File

@ -31,6 +31,9 @@ So far the features listed below have been completed to some degree:
- Linting (JS) - Linting (JS)
- Implemented: ction triggers on any PR, uses eslint to perform style enforcement on all JS components - Implemented: ction triggers on any PR, uses eslint to perform style enforcement on all JS components
- ToDo: trigger workflow only on certain PRs which relate to JS code - ToDo: trigger workflow only on certain PRs which relate to JS code
- Linting (HTML)
- Implemented: action triggers on any PR, uses HTMLhint to perform style enforcement on all HTML components
- Linting (CSS)
- Implemented: action triggers on any PR, uses Stylelint to perform style enforcement on all CSS components
## Planned Features and Timeline
## Planned Features and Timeline

Binary file not shown.

View File

@ -1,47 +1,47 @@
# Meeting Minutes (10/12/2022) # Meeting Minutes (10/12/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Kickoff Meeting ## Meeting Topic: Kickoff Meeting
This meeting is being held to kickoff the start of many meetings to come during the quarter. This meeting is being held to kickoff the start of many meetings to come during the quarter.
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada
2. George Dubinin 2. George Dubinin
3. Gavyn Ezell 3. Gavyn Ezell
4. Henry Feng 4. Henry Feng
5. Kara Hoagland 5. Kara Hoagland
6. Marc Reta 6. Marc Reta
7. Sanjit Joseph 7. Sanjit Joseph
8. Isaac Otero 8. Isaac Otero
9. Daniel Hernandez 9. Daniel Hernandez
## Absentees ## Absentees
1. Arthur Lu 1. Arthur Lu
## Meeting Details ## Meeting Details
- When: 10/12/2022 at 3:30PM - When: 10/12/2022 at 3:30PM
- Where: Zoom - Where: Zoom
## Agenda: ## Agenda:
- ### Old/Unresolved Business - ### Old/Unresolved Business
- N/A - N/A
- ### New Business - ### New Business
- go over github organization - go over github organization
- review assignments - review assignments
- go through rules - go through rules
- start branding/team name - start branding/team name
- ### Next Meeting's Business - ### Next Meeting's Business
- figure out roles - figure out roles
- decide weekly meeting times - decide weekly meeting times
- figure out team bonding events - figure out team bonding events
- brainstorm CRUD applications - brainstorm CRUD applications
- complete any remaining assignments - complete any remaining assignments
## Decisions Made ## Decisions Made
- went over github organizations and reviewed the assignments - went over github organizations and reviewed the assignments
- went through the rules and agreed on the contract - went through the rules and agreed on the contract
- figured out the brand name - figured out the brand name
## End Time ## End Time
- 10/12/2022 at 4:30PM - 10/12/2022 at 4:30PM

View File

@ -1,32 +1,32 @@
# Meeting Minutes (10/12/2022) # Meeting Minutes (10/12/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Weekly Check-In Meeting ## Meeting Topic: Weekly Check-In Meeting
This meeting is the first weekly meeting with TA This meeting is the first weekly meeting with TA
## Attendance ## Attendance
1. Gagan Gopalaiah 1. Gagan Gopalaiah
2. Rhea Bhutada 2. Rhea Bhutada
3. Kara Hoagland 3. Kara Hoagland
4. Marc Reta 4. Marc Reta
5. Arthur 5. Arthur
## Meeting Details ## Meeting Details
- When: 10/12/2022 at 8:00PM - When: 10/12/2022 at 8:00PM
- Where: Zoom - Where: Zoom
## Agenda: ## Agenda:
- ### Reviewed Project Details - ### Reviewed Project Details
- building CRUD app - building CRUD app
- utilizing HTML, CSS, JavaScript - utilizing HTML, CSS, JavaScript
- general domain is better than specific domain - general domain is better than specific domain
- ### Get Started early - ### Get Started early
- brainstorm CRUD apps - brainstorm CRUD apps
- review assignments - review assignments
- figure out unit test code - figure out unit test code
- familiarize yourself with GitHub Actions - familiarize yourself with GitHub Actions
## Important Information ## Important Information
- Gagan OH (6:30PM-7:30PM on Wednesday) in CSE Basement - Gagan OH (6:30PM-7:30PM on Wednesday) in CSE Basement
- Reserved the room if any of us want to meet there. TA not going to present unless required. - Reserved the room if any of us want to meet there. TA not going to present unless required.
## End Time ## End Time
- 10/12/2022 at 8:30PM - 10/12/2022 at 8:30PM

View File

@ -1,50 +1,50 @@
# Meeting Minutes (10/19/2022) # Meeting Minutes (10/19/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Weekly Check-In Meeting ## Meeting Topic: Weekly Check-In Meeting
This meeting is the second weekly meeting with TA. This meeting is the second weekly meeting with TA.
## Attendance ## Attendance
1. Gagan Gopalaiah 1. Gagan Gopalaiah
2. Rhea Bhutada 2. Rhea Bhutada
3. George Dubinin 3. George Dubinin
4. Kara Hoagland 4. Kara Hoagland
5. Marc Reta 5. Marc Reta
6. Arthur Lu 6. Arthur Lu
7. Gavyn Ezell 7. Gavyn Ezell
8. Isaac Otero 8. Isaac Otero
## Meeting Details ## Meeting Details
- When: 10/19/2022 at 8:00PM - When: 10/19/2022 at 8:00PM
- Where: Zoom - Where: Zoom
## Agenda: ## Agenda:
- ### Recap of last week - ### Recap of last week
- went over assignments - went over assignments
- discussed feelings on the midterm - discussed feelings on the midterm
- ### New Potential Meeting Time - ### New Potential Meeting Time
- without TA unless necessary - without TA unless necessary
- before lecture on Monday in CSE Basement - before lecture on Monday in CSE Basement
- ### Upcoming Assignments - ### Upcoming Assignments
- two coming up - two coming up
- brainstorm activity (due 10/23) - brainstorm activity (due 10/23)
- continue brainstorming throughout the week - continue brainstorming throughout the week
- due sunday - due sunday
- pitch (11/1) - pitch (11/1)
- initial draft by 10/25 - 10/26 - initial draft by 10/25 - 10/26
- ### Tips on Designing - ### Tips on Designing
- user center design - user center design
- define the problem first, then the tools/techniques - define the problem first, then the tools/techniques
- finalize on the product and its features, then decide on how to build it - finalize on the product and its features, then decide on how to build it
- ### Standup - ### Standup
- not expected everyday - not expected everyday
- once every two days is ideal - once every two days is ideal
- doesn't have to be too descriptive - doesn't have to be too descriptive
- ### Review of Recent Brainstorming Session - ### Review of Recent Brainstorming Session
## End Time ## End Time
- 10/19/2022 at 3:50PM - 10/19/2022 at 3:50PM

View File

@ -1,40 +1,40 @@
# Meeting Minutes (10/23/2022) # Meeting Minutes (10/23/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Application Final Decision ## Meeting Topic: Application Final Decision
This meeting is held to help the group decide on which kind of app to build. This meeting is held to help the group decide on which kind of app to build.
## Attendance ## Attendance
1. George Dubinin 1. George Dubinin
2. Henry Feng 2. Henry Feng
3. Arthur Lu 3. Arthur Lu
4. Marc Reta 4. Marc Reta
5. Kara Hoagland 5. Kara Hoagland
6. Rhea Bhutada 6. Rhea Bhutada
7. Isaac Otero 7. Isaac Otero
## Absentees ## Absentees
1. Sanjit Joseph 1. Sanjit Joseph
2. Gavyn Ezell 2. Gavyn Ezell
3. Daniel Hernandez 3. Daniel Hernandez
## Meeting Details ## Meeting Details
- When: - When:
- 10/23/2022 at 1:00PM - 10/23/2022 at 1:00PM
- Where: Zoom (Rhea's Meeting Room) - Where: Zoom (Rhea's Meeting Room)
## Agenda: ## Agenda:
- ### Old/Unresolved Business - ### Old/Unresolved Business
- N/A - N/A
- ### New Business - ### New Business
- Decide on a final app idea - Decide on a final app idea
- ### Next Meeting's Business - ### Next Meeting's Business
- Discuss design features for the chosen app - Discuss design features for the chosen app
## Decisions Made ## Decisions Made
- Maybe for the food reviewer app. Presenting possible writeup to Gagan - Maybe for the food reviewer app. Presenting possible writeup to Gagan
- Maybe for the resume builder. Presenting possible writeup to Gagan https://docs.google.com/document/d/1zdvVxd47Ivdz-D0rZGNJqc3D9GiQj0n_xMJKapOV39A/edit?usp=sharing - Maybe for the resume builder. Presenting possible writeup to Gagan https://docs.google.com/document/d/1zdvVxd47Ivdz-D0rZGNJqc3D9GiQj0n_xMJKapOV39A/edit?usp=sharing
- Maybe for Social Media Local Archive. Presenting possible writeup to Gagan https://docs.google.com/document/d/1upNr6lneB2uzCoQ12_aa1CMg1W8p2NBFb6xmP7i4-z4/edit?usp=sharing - Maybe for Social Media Local Archive. Presenting possible writeup to Gagan https://docs.google.com/document/d/1upNr6lneB2uzCoQ12_aa1CMg1W8p2NBFb6xmP7i4-z4/edit?usp=sharing
- No to the copy/paste app (not local first) - No to the copy/paste app (not local first)
## End Time ## End Time
- When: - When:
- 10/23/2022 at 2:00PM - 10/23/2022 at 2:00PM

View File

@ -1,44 +1,44 @@
# Meeting Minutes (10/26/2022) # Meeting Minutes (10/26/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Weekly Check-In Meeting ## Meeting Topic: Weekly Check-In Meeting
This is our third weekly meeting with Gagan. This is our third weekly meeting with Gagan.
## Attendance ## Attendance
TA. Gagan Gopalaiah TA. Gagan Gopalaiah
1. Rhea Bhutada 1. Rhea Bhutada
2. George Dubinin 2. George Dubinin
3. Sanjit Joseph 3. Sanjit Joseph
4. Arthur Lu 4. Arthur Lu
5. Gavyn Ezell 5. Gavyn Ezell
## Meeting Details ## Meeting Details
- When: 10/26/2022 at 3:00 PM - When: 10/26/2022 at 3:00 PM
- Where: Zoom (Gagan's Zoom room: https://ucsd.zoom.us/j/5177090642) - Where: Zoom (Gagan's Zoom room: https://ucsd.zoom.us/j/5177090642)
## Agenda: ## Agenda:
- ### Present our ideas to Gagan - ### Present our ideas to Gagan
- All ideas seem to be doable - All ideas seem to be doable
- Consider a few tweaks to "CRUDify" apps - Consider a few tweaks to "CRUDify" apps
- Gagan is partial to food review app idea, but any of them can work - Gagan is partial to food review app idea, but any of them can work
- ### Tips for projects - ### Tips for projects
- SOCIAL MEDIA ORGANIZER: avoid API integration if possible/only make it a small part, not a main feature - SOCIAL MEDIA ORGANIZER: avoid API integration if possible/only make it a small part, not a main feature
- RESUME BUILDER: try to "CRUDify" it more if we're going for this - RESUME BUILDER: try to "CRUDify" it more if we're going for this
- ### Standups - ### Standups
- Once per 2 days, 3 in worst case - Once per 2 days, 3 in worst case
- Perhaps make a separate slack channel for these to avoid clutter - Perhaps make a separate slack channel for these to avoid clutter
## Moving forward: ## Moving forward:
- ### BY FRIDAY: - ### BY FRIDAY:
- Try and meet tomorrow (10/27) to make a final decision - Try and meet tomorrow (10/27) to make a final decision
- Let Gagan know what we've decided on - Let Gagan know what we've decided on
- Complete project pitch assignment - need to present to Gagan tomorrow 10/27, due on canvas 11/1 - Complete project pitch assignment - need to present to Gagan tomorrow 10/27, due on canvas 11/1
- ### OVER WEEKEND: - ### OVER WEEKEND:
- (If possible) Start on CI/CD pipeline (basic js app/unit tests, use Github actions to set up) - (If possible) Start on CI/CD pipeline (basic js app/unit tests, use Github actions to set up)
## End Time ## End Time
- 10/26/2022 at 4:00 PM - 10/26/2022 at 4:00 PM

View File

@ -1,60 +1,60 @@
# Meeting Minutes (10/27/2022) # Meeting Minutes (10/27/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Final Project Decision ## Meeting Topic: Final Project Decision
We're figuring out what project we're going to do, and figure out what we need for the starting pitch. We're figuring out what project we're going to do, and figure out what we need for the starting pitch.
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada
2. Sanjit Joseph 2. Sanjit Joseph
3. Arthur Lu 3. Arthur Lu
4. Henry Feng 4. Henry Feng
5. Marc Reta 5. Marc Reta
6. Kara Hoagland 6. Kara Hoagland
7. Daniel Hernandez 7. Daniel Hernandez
8. Gavyn Ezell 8. Gavyn Ezell
9. Isaac Otero 9. Isaac Otero
## Meeting Details ## Meeting Details
- When: 10/27/2022 at 5:00 PM - When: 10/27/2022 at 5:00 PM
- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343)
## Agenda: ## Agenda:
- ### Decide which project we're doing - ### Decide which project we're doing
- Gagan seemed to like the food review app idea best in their current states - Gagan seemed to like the food review app idea best in their current states
- We all seem to agree that the food review app is acceptable - We all seem to agree that the food review app is acceptable
- Made a couple clarifications, no major changes or objections to the app - Made a couple clarifications, no major changes or objections to the app
- ### Start project pitch - ### Start project pitch
- Created google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** - Created google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing**
- Prof recommends skimming the book: **https://basecamp.com/shapeup** (esp. ch.5 on risks and rabbit holes) - Prof recommends skimming the book: **https://basecamp.com/shapeup** (esp. ch.5 on risks and rabbit holes)
- Finishing Risks + Rabbit holes here in the meeting - Finishing Risks + Rabbit holes here in the meeting
- Kara posted a design prototype in Slack: https://cse110fall2022.slack.com/archives/C04598WA7P1/p1666918573779859 - Kara posted a design prototype in Slack: https://cse110fall2022.slack.com/archives/C04598WA7P1/p1666918573779859
- ### App Description - ### App Description
- Renaming it to a "Food Diary" app, not limited to UCSD - Renaming it to a "Food Diary" app, not limited to UCSD
- Allows users to store info about recent foods, restaurant name, location, price, your rating etc. - Allows users to store info about recent foods, restaurant name, location, price, your rating etc.
- Probably provides food suggestions based on where you've eaten (and liked) before - Probably provides food suggestions based on where you've eaten (and liked) before
- We're not going to try anything with external data atm. - We're not going to try anything with external data atm.
## Moving forward: ## Moving forward:
- ### BY TOMORROW: - ### BY TOMORROW:
- FINISH PITCH SLIDES - FINISH PITCH SLIDES
- MUST CHANGE DIAGRAM TO ALL RESTAURANTS (Isaac will change this) - MUST CHANGE DIAGRAM TO ALL RESTAURANTS (Isaac will change this)
- Daniel will update the pitch slides by adding images/graphics. - Daniel will update the pitch slides by adding images/graphics.
- Daniel + Sanjit are doing visual representation. - Daniel + Sanjit are doing visual representation.
- Gayvn is doing potential competitors - Gayvn is doing potential competitors
- Henry, Sanjit, Kara are doing user personas - Henry, Sanjit, Kara are doing user personas
- Rhea is doing statement + purpose - Rhea is doing statement + purpose
- Arthur + Marc are doing "why it's a CRUD app" - Arthur + Marc are doing "why it's a CRUD app"
- See if we can have a short meeting tomorrow before meeting Gagan just to review our pitch. - See if we can have a short meeting tomorrow before meeting Gagan just to review our pitch.
- Put all components in specs folder before pitch - Put all components in specs folder before pitch
- Meet at 2:30? Meeting with Gagan is probably at 3:30 - Meet at 2:30? Meeting with Gagan is probably at 3:30
- ### LATER: - ### LATER:
- Have some people split off and work on the basic UI design. Technically Sanjit had the 'art role' according to the TA but not sure what that entails. More ppl would def be helpful. TBD who else is helping - Have some people split off and work on the basic UI design. Technically Sanjit had the 'art role' according to the TA but not sure what that entails. More ppl would def be helpful. TBD who else is helping
## End Time ## End Time
- 10/27/2022 at 6:15 PM - 10/27/2022 at 6:15 PM

View File

@ -1,24 +1,24 @@
# Meeting Minutes (10/28/2022) # Meeting Minutes (10/28/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Project Pitch ## Meeting Topic: Project Pitch
We finished up the project pitch docs and presenting them to Gagan. We finished up the project pitch docs and presenting them to Gagan.
Google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** Google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing**
## Meeting Details ## Meeting Details
- When: 10/28/2022 at 2:30 PM - When: 10/28/2022 at 2:30 PM
- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343)
## Agenda: ## Agenda:
- ### Finish Project Pitch documents - ### Finish Project Pitch documents
- Finished user stories/diagrams and uploaded to github - Finished user stories/diagrams and uploaded to github
- Went over presentation before showing TA - Went over presentation before showing TA
- Presented project to Gagan - Presented project to Gagan
- **Overall reaction - he liked our app! More feedback to come, but we can feel free to start some basic work.** - **Overall reaction - he liked our app! More feedback to come, but we can feel free to start some basic work.**
## Moving forward: ## Moving forward:
- I think we need to upload our project pitch to canvas by 11/1 - I think we need to upload our project pitch to canvas by 11/1
- Start on the really basic stuff as discussed in lecture (hello world for CI/CD setup, etc) - Start on the really basic stuff as discussed in lecture (hello world for CI/CD setup, etc)
## End Time ## End Time
- 10/28/2022 at 4:00 PM - 10/28/2022 at 4:00 PM

View File

@ -1,41 +1,41 @@
# Meeting Minutes (11/01/2022) # Meeting Minutes (11/01/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Work going forward ## Meeting Topic: Work going forward
We're trying to figure out what our goals are for the project and how to get started. We're trying to figure out what our goals are for the project and how to get started.
## Meeting Details ## Meeting Details
- When: 11/01/2022 at 7:00 PM - When: 11/01/2022 at 7:00 PM
- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343)
## Attendance ## Attendance
1. Rhea 1. Rhea
2. Gavyn 2. Gavyn
3. Isaac 3. Isaac
4. Kara 4. Kara
5. Marc 5. Marc
6. Henry 6. Henry
7. Daniel 7. Daniel
8. Sanjit 8. Sanjit
## Notes: ## Notes:
- Gagan suggests we have a feature backlog and pull stuff from that - Gagan suggests we have a feature backlog and pull stuff from that
- Using Github Issues for our feature backlog - Using Github Issues for our feature backlog
- Perhaps integrate TTS from Lab5 into something (pick a random restaurant while driving, etc) - Perhaps integrate TTS from Lab5 into something (pick a random restaurant while driving, etc)
- Created figma sketch for app design, uploaded to github and google slides - Created figma sketch for app design, uploaded to github and google slides
## Moving forward: ## Moving forward:
- ### BY TONIGHT: - ### BY TONIGHT:
- We'll submit our pitch files - We'll submit our pitch files
- ### LATER: - ### LATER:
- Sanjit will upload a basic hello world program in order to test deployment/github actions - Sanjit will upload a basic hello world program in order to test deployment/github actions
- Arthur will start figuring out how to configure github actions - Arthur will start figuring out how to configure github actions
- ### PREFERENCES: - ### PREFERENCES:
- BACKEND: Henry, Gavyn, Kara - BACKEND: Henry, Gavyn, Kara
- FRONTEND: Isaac - FRONTEND: Isaac
- NO PREFERENCE: Daniel, Marc, Rhea, Sanjit - NO PREFERENCE: Daniel, Marc, Rhea, Sanjit
## End Time ## End Time
- 11/01/2022 at 9:00 PM - 11/01/2022 at 9:00 PM

View File

@ -1,34 +1,34 @@
# Meeting Minutes (11/02/2022) # Meeting Minutes (11/02/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Weekly TA Catchup with Gagan ## Meeting Topic: Weekly TA Catchup with Gagan
We are meeting with Gagan to discuss early phase design concepts and decisions we need to think about as we start the early coding phase. We are meeting with Gagan to discuss early phase design concepts and decisions we need to think about as we start the early coding phase.
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada
2. George Dubinin 2. George Dubinin
3. Gagan Gopalaiah 3. Gagan Gopalaiah
## Meeting Details ## Meeting Details
- When: 11/02/2022 at 3:30PM - When: 11/02/2022 at 3:30PM
- Where: Zoom - Where: Zoom
## Agenda: ## Agenda:
## Discussion Points by Gagan ## Discussion Points by Gagan
- Now that we finished designs stage there are 2 approaches - Now that we finished designs stage there are 2 approaches
- The first is to just start coding without thinking about design (cowboy coding). It works but can get bumpy down the road - The first is to just start coding without thinking about design (cowboy coding). It works but can get bumpy down the road
- The second is to look at the project from a birds eye view and break it down into milestones and tasks. First break it down into weeks and then decide on what to do each day of the week. This will make it easier to keep things organized. - The second is to look at the project from a birds eye view and break it down into milestones and tasks. First break it down into weeks and then decide on what to do each day of the week. This will make it easier to keep things organized.
- Jira and GitHub issues will be super helpful. Jira is a more expensive option so instead prof recommends creating issues. - Jira and GitHub issues will be super helpful. Jira is a more expensive option so instead prof recommends creating issues.
- Start thinking about storage options. Think local first and decide on options like: - Start thinking about storage options. Think local first and decide on options like:
- locally stored json files - locally stored json files
- browser local storage - browser local storage
- "real" database like IndexDB - "real" database like IndexDB
- Think about different models to keep track of changes and versions. Consider the branching model (one central repository and everyone has a branch or one breanch per feature) and the forking model (the central repository is copied and developers work in these copies and push changes to their own copies before syncing to the central repo). Useful info here: https://www.flagship.io/git-branching-strategies/ - Think about different models to keep track of changes and versions. Consider the branching model (one central repository and everyone has a branch or one breanch per feature) and the forking model (the central repository is copied and developers work in these copies and push changes to their own copies before syncing to the central repo). Useful info here: https://www.flagship.io/git-branching-strategies/
- Think about how pull requests will be approved and create a system for PR review and suggests. - Think about how pull requests will be approved and create a system for PR review and suggests.
- Break down the project and decide on which tasks to be completed. Then decide on how long sprints will last and how tasks will be assigned. - Break down the project and decide on which tasks to be completed. Then decide on how long sprints will last and how tasks will be assigned.
- We need to create the ADR and place it in the brainstorming section of the repo. This will contain details about specific project decisions that we made like database decisions (for example). - We need to create the ADR and place it in the brainstorming section of the repo. This will contain details about specific project decisions that we made like database decisions (for example).
## End Time ## End Time
- 11/02/2022 at 4:00PM - 11/02/2022 at 4:00PM

View File

@ -1,41 +1,41 @@
# Meeting Minutes (11/07/2022) # Meeting Minutes (11/07/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: First Sprint ## Meeting Topic: First Sprint
Meeting notes for the first sprint Meeting notes for the first sprint
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada
2. George Dubinin 2. George Dubinin
3. Gavyn Ezell 3. Gavyn Ezell
4. Henry Feng 4. Henry Feng
5. Kara Hoagland 5. Kara Hoagland
6. Marc Reta 6. Marc Reta
7. Sanjit Joseph 7. Sanjit Joseph
8. Daniel Hernandez 8. Daniel Hernandez
9. Arthur Lu 9. Arthur Lu
## Absentees ## Absentees
1. Isaac Otero 1. Isaac Otero
## Meeting Details ## Meeting Details
- When: 11/07/2022 at 6:00PM - When: 11/07/2022 at 6:00PM
- Where: CSE Building Second Floor - Where: CSE Building Second Floor
## Agenda: ## Agenda:
- ### Old/Unresolved Business - ### Old/Unresolved Business
- N/A - N/A
- ### New Business - ### New Business
- The first sprint: - The first sprint:
- Create more Gitflows and automation. Verify current workflows and actions - Create more Gitflows and automation. Verify current workflows and actions
- Determine interface details for the app (user experience) - Determine interface details for the app (user experience)
- Start on the backend - Start on the backend
- ### Next Meeting's Business - ### Next Meeting's Business
## Decisions Made ## Decisions Made
- Linting details decided (TABS NOT SPACES) - Linting details decided (TABS NOT SPACES)
## End Time ## End Time
- 11/07/2022 at 8:00PM - 11/07/2022 at 8:00PM

View File

@ -0,0 +1,39 @@
# Meeting Minutes (11/08/2022)
## Team 29: Hackers1995
## Meeting Topic: In-Person First Sprint Day 2
Meeting notes for the first sprint
## Attendance
1. Rhea Bhutada
2. George Dubinin
3. Gavyn Ezell
4. Kara Hoagland
5. Sanjit Joseph
6. Daniel Hernandez
## Meeting Details
- When: 11/08/2022 at 2:00PM
- Where: Mike's Red Tacos
## Agenda:
- ### Old/Unresolved Business
- N/A
- ### New Business
- Isaac now knows what Wolftown is
- Pair programming setup with VSCode
- ### Next Meeting's Business
## App Progress
- The landing page is closer
- Review card css file entered
- Review Card javascript logic implemented (thanks Gavin)
-
## Decisions Made
- Linting details decided (TABS NOT SPACES)
## End Time
- 11/07/2022 at 8:00PM

View File

@ -1,36 +1,36 @@
# Meeting Minutes (11/09/2022) # Meeting Minutes (11/09/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Weekly TA Catchup with Gagan ## Meeting Topic: Weekly TA Catchup with Gagan
We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing. We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing.
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada
2. George Dubinin 2. George Dubinin
3. Gagan Gopalaiah 3. Gagan Gopalaiah
4. Sanjit Joseph 4. Sanjit Joseph
## Meeting Details ## Meeting Details
- When: 11/09/2022 at 3:30PM - When: 11/09/2022 at 3:30PM
- Where: Zoom - Where: Zoom
## Agenda: ## Agenda:
## Discussion Points by Gagan ## Discussion Points by Gagan
- Provided updates on first sprint - Provided updates on first sprint
- Testing Tips - Testing Tips
- functionality testing - functionality testing
- test one feature - test one feature
- test individual functions - test individual functions
- static testing - static testing
- checking if its meeting the conventions and standards for specific programming language - checking if its meeting the conventions and standards for specific programming language
- linting - linting
- specific to programming language - specific to programming language
- overall - overall
- if tested properly, we reduce problems end-to-end testing - if tested properly, we reduce problems end-to-end testing
- Documentation - Documentation
- What the code does? - What the code does?
- What the file is for? - What the file is for?
- JS Docs - JS Docs
## End Time ## End Time
- 11/09/2022 at 4:00PM - 11/09/2022 at 4:00PM

View File

@ -55,6 +55,14 @@ Overall we feel that sprint 1 was a success with many lessons learned. Our enthu
* Scheduled meetings with more notice and keep meetings at a more central location so that more members can attend * Scheduled meetings with more notice and keep meetings at a more central location so that more members can attend
* Get the unit testing modules up to date * Get the unit testing modules up to date
* To-do: create a style guide * To-do: create a style guide
* Heed the styles and documentation (to avoid linter issues)
## Early Issues
* restructure local storage to store individual (key, review) pairs rather than storing data under one key (current schema)
* implement a file upload system (think canvas file upload)
* add a cuisine attribute for tagging and filtering
* Create UI buttons and low fidelity css
* Unit test all the above
## End Time ## End Time
- 11/14/2022 at 5:00PM - 11/14/2022 at 5:00PM

View File

@ -1,6 +1,7 @@
# Sprint 1 Review Meeting Minutes (11/13/2022) # Sprint 1 Review Meeting Minutes (11/13/2022)
## Team 29: Hackers1995 ## Team 29: Hackers1995
## Meeting Topic: Sprint 1 Review ## Meeting Topic: Sprint 1 Review
We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing.
## Attendance ## Attendance
1. Rhea Bhutada 1. Rhea Bhutada

View File

@ -0,0 +1,33 @@
# Meeting Minutes (11/16/2022)
## Team 29: Hackers1995
## Meeting Topic: Weekly TA Catchup with Gagan
We are meeting with Gagan to discuss Checkpoint 1 and Sprint 2 resolutions.
## Attendance
1. Rhea Bhutada
2. George Dubinin
3. Gagan Gopalaiah
4. Kara Hoagland
## Meeting Details
- When: 11/16/2022 at 3:30PM
- Where: Zoom
## Agenda:
## Discussion Points by Gagan
- Updated Gagan on Sprint 1
- looked at Girhub actions
- looked at the published page so far
- discussed retrospective
- Upcoming Assignments
- we have to come up with a video on the status of our app
- ramp up the styling part, so u can brag about the design of the app
- this video is supposed to encourage healthy competition
- Other Concerns
- JSDocs - not primary concern right now
- GitHub Pages vs. Netlify
- Gagan sees Netlify as more professional and not to difficult to implement
## End Time
- 11/09/2022 at 3:45PM

View File

@ -0,0 +1,47 @@
# Meeting Minutes (11/07/2022)
## Team 29: Hackers1995
## Meeting Topic: First Sprint
Meeting notes for the first sprint
## Attendance
1. Rhea Bhutada
2. George Dubinin
3. Gavyn Ezell
4. Henry Feng
5. Kara Hoagland
6. Marc Reta
7. Sanjit Joseph
8. Daniel Hernandez
9. Arthur Lu
10. Isaac Otero
## Meeting Details
- When: 11/17/2022 at 11:30PM
- Where: Design & Innovation Building
## Agenda:
- ### Old/Unresolved Business
- N/A
- ### New Business
- Second sprint commences!
- Focus on design progress for the project showoff
- Cuisine vs Tag identifiers for reviews (both?)
- localStorage will hold:
- list of active IDs which is updated for very create operation. An ID uniquely identifies a review
- value, "nextId" denoting the index of the next available slot for an Id
- entries for every single review (javascript object)
- a list for every tag that denotes which Ids belong to reviews containing this tag
End2end tests will rely on specific html element names which include the following:
- "create-btn" (located on homepage and used to create a new review)
- "submit-btn" (located on form and used to post review)
- "update-btn" (located on a specific review page)
- "delete-btn" (located on a specific review page)
- "tag-add-btn" (located on the review create form)
- ### Next Meeting's Business
## Decisions Made
-
## End Time
- 11/17/2022 at 1:00PM

View File

@ -1,57 +1,57 @@
# Team Working Agreement # Team Working Agreement
## Term: Fall 2022 ## Term: Fall 2022
## Creation: 10/12/2022; Revised: N/A ## Creation: 10/12/2022; Revised: N/A
## Group Identification ## Group Identification
- Team 29 - Team 29
- TA: Gagan Gopalaiah - TA: Gagan Gopalaiah
- Instructor: Professor Thomas Powell - Instructor: Professor Thomas Powell
- Team Name: Hackers1995 - Team Name: Hackers1995
## Team member info (name/email) ## Team member info (name/email)
1. Rhea Bhutada, rbhutada@ucsd.edu 1. Rhea Bhutada, rbhutada@ucsd.edu
2. George Dubinin, gdubinin@ucsd.edu 2. George Dubinin, gdubinin@ucsd.edu
3. Gavyn Ezell, gezell@ucsd.edu 3. Gavyn Ezell, gezell@ucsd.edu
4. Henry Feng, hefeng@ucsd.edu 4. Henry Feng, hefeng@ucsd.edu
5. Kara Hoagland, khoaglan@ucsd.edu 5. Kara Hoagland, khoaglan@ucsd.edu
6. Marc Reta, mreta@ucsd.edu 6. Marc Reta, mreta@ucsd.edu
7. Sanjit Joseph, smjoseph@ucsd.edu 7. Sanjit Joseph, smjoseph@ucsd.edu
8. Isaac Otero, irotero@ucsd.edu 8. Isaac Otero, irotero@ucsd.edu
9. Arthur Lu, a8lu@ucsd.edu 9. Arthur Lu, a8lu@ucsd.edu
10. Daniel Hernandez, d7hernan@ucsd.edu 10. Daniel Hernandez, d7hernan@ucsd.edu
## RULES: ## RULES:
#### 1) Primary Means of Communication and Expectations #### 1) Primary Means of Communication and Expectations
- All members will communicate via Slack. - All members will communicate via Slack.
- All members will be expected to read messages from group chats and direct messages, and respond in no more than 4 hours and no later than 10PM. - All members will be expected to read messages from group chats and direct messages, and respond in no more than 4 hours and no later than 10PM.
- All pull requests require 3 people to review the code being pushed to main. - All pull requests require 3 people to review the code being pushed to main.
#### 2) Scheduling Meetings (Schedule at least one meeting as part of constructing your team agreement.) #### 2) Scheduling Meetings (Schedule at least one meeting as part of constructing your team agreement.)
- Members are expected to meet at least once a week with the group either in-person or on Zoom. Future meeting details will be determined within a 24 hours window. - Members are expected to meet at least once a week with the group either in-person or on Zoom. Future meeting details will be determined within a 24 hours window.
- Team members hosting the meeting will send out a reminder of the meeting with an agenda 2 hours before the meeting. - Team members hosting the meeting will send out a reminder of the meeting with an agenda 2 hours before the meeting.
#### 3) General Responsibilities for All Team Members #### 3) General Responsibilities for All Team Members
- Respect the contributions of others. - Respect the contributions of others.
- Work on assignments early to allow others to review and debug any issues. - Work on assignments early to allow others to review and debug any issues.
- Communicate any issues or problems as early as possible. - Communicate any issues or problems as early as possible.
- Be open to criticism. - Be open to criticism.
#### 4) Specific Team Member Responsibilities/Deadlines (Optional) #### 4) Specific Team Member Responsibilities/Deadlines (Optional)
- A daily standup is required every day from every team member. A daily standup includes what you've completed, what you want to work on, and what issues you encountered for the day. If you haven't done anything for that day, write down what you will be contributing. - A daily standup is required every day from every team member. A daily standup includes what you've completed, what you want to work on, and what issues you encountered for the day. If you haven't done anything for that day, write down what you will be contributing.
#### 5) Conflict Resolution #### 5) Conflict Resolution
- Conflicts between individuals will first try to be resolved amongst the people involved. - Conflicts between individuals will first try to be resolved amongst the people involved.
- Group conflicts will be voted on. - Group conflicts will be voted on.
- Ongoing conflicts will be reported to the TA. - Ongoing conflicts will be reported to the TA.
- Unprofessionalism of any kind will not be tolerated. Conflicts involving this will immediately be brought up with the TA - Unprofessionalism of any kind will not be tolerated. Conflicts involving this will immediately be brought up with the TA
#### 6) Expectations of Faculty and GTAs #### 6) Expectations of Faculty and GTAs
- If a team member fails to live up to this agreement, the situation may be reported to the staff, but the team will still be responsible for submitting a completed assignment. Staff will be available to meet with teams to resolve issues. - If a team member fails to live up to this agreement, the situation may be reported to the staff, but the team will still be responsible for submitting a completed assignment. Staff will be available to meet with teams to resolve issues.
## Team Signatures ## Team Signatures
#### Print Name: #### Print Name:
#### Signature: #### Signature:

View File

@ -1,73 +1,73 @@
# **Hackers1995** # **Hackers1995**
## **Brand** ## **Brand**
![poster](./branding/teamposter.jpg) ![poster](./branding/teamposter.jpg)
## **Values** ## **Values**
- Openness - Openness
- Honesty - Honesty
- Respect - Respect
- Integrity - Integrity
- Diversity/Inclusion - Diversity/Inclusion
## **Roster** ## **Roster**
### **TA: Gagan Gopalaiah** ### **TA: Gagan Gopalaiah**
### **Team Lead: Rhea Bhutada** ### **Team Lead: Rhea Bhutada**
- #### About Me: - #### About Me:
- My name is Rhea Bhutada and I am currently a CS major and CogSci minor at ERC. The intersection between neuroscience and computer science really fascinates me and I generally try to apply myself to projects that deal with the overlap of both of these fields. This year I'm working as an undergraduate researcher at the Swartz Center for Computational Neuroscience, which has been an extremely cool experience. Other than that I love to stay active. I used to play basketball in high school and was in an NCAA commercial with Shaq. But lately, Ive been really into running. Overall, I'm excited to contribute to this project! Although I haven't had too much industry experience, I am interested to see how I can apply my previous course work to backend or frontend design. - My name is Rhea Bhutada and I am currently a CS major and CogSci minor at ERC. The intersection between neuroscience and computer science really fascinates me and I generally try to apply myself to projects that deal with the overlap of both of these fields. This year I'm working as an undergraduate researcher at the Swartz Center for Computational Neuroscience, which has been an extremely cool experience. Other than that I love to stay active. I used to play basketball in high school and was in an NCAA commercial with Shaq. But lately, Ive been really into running. Overall, I'm excited to contribute to this project! Although I haven't had too much industry experience, I am interested to see how I can apply my previous course work to backend or frontend design.
- #### Link to Github: https://github.com/rheabhutada02 - #### Link to Github: https://github.com/rheabhutada02
### **Team Lead: George Dubinin** ### **Team Lead: George Dubinin**
- #### About Me: - #### About Me:
- Hello World! I'm a fifth year (3rd year transfer) computer science major from the North Bay Area. Web development has been a big focus of mine since taking Prof Powell's 134B last winter and I'm stoked to be back in the "full stack" developer seat for 110. I am the second the team lead and in addition to my love for leading and working on team projects I am also fascinated by web development technologies including containerization, infrastructure as code (IaC), software as a service (SAAS), and web-based encryption (security). I am also an avid DJ and the traininer manmager for the DJ club on campus. This quarter is shaping up to be a memorable one! - Hello World! I'm a fifth year (3rd year transfer) computer science major from the North Bay Area. Web development has been a big focus of mine since taking Prof Powell's 134B last winter and I'm stoked to be back in the "full stack" developer seat for 110. I am the second the team lead and in addition to my love for leading and working on team projects I am also fascinated by web development technologies including containerization, infrastructure as code (IaC), software as a service (SAAS), and web-based encryption (security). I am also an avid DJ and the traininer manmager for the DJ club on campus. This quarter is shaping up to be a memorable one!
- #### Link to Github: https://github.com/look-its-ashton - #### Link to Github: https://github.com/look-its-ashton
### **Gavyn Ezell** ### **Gavyn Ezell**
- #### About Me: - #### About Me:
- My name is Gavyn Ezell and Im from Hawaii. Currently a 3rd year CS Major at Muir. I love video games, playing piano, and going to the gym. For SWE, backend interests me most (I am not good with design and visuals), and Im hoping to learn a lot more backend from this project! - My name is Gavyn Ezell and Im from Hawaii. Currently a 3rd year CS Major at Muir. I love video games, playing piano, and going to the gym. For SWE, backend interests me most (I am not good with design and visuals), and Im hoping to learn a lot more backend from this project!
- #### Link to Github: https://github.com/gavyn-ezell - #### Link to Github: https://github.com/gavyn-ezell
### **Daniel Hernandez** ### **Daniel Hernandez**
- #### About Me: - #### About Me:
- My name is Daniel Hernandez and I am a 3rd year Computer Science major and music minor. Some of my interests in the CS field are ML, AI, and Cybersecurity. Outside of school, I play drums for a local band. For SE, the backend aspect appeals to me the most since I am able to utilize more of what I learned from my past classes. However, I would want to try frontend since I do enjoy design to some extent. - My name is Daniel Hernandez and I am a 3rd year Computer Science major and music minor. Some of my interests in the CS field are ML, AI, and Cybersecurity. Outside of school, I play drums for a local band. For SE, the backend aspect appeals to me the most since I am able to utilize more of what I learned from my past classes. However, I would want to try frontend since I do enjoy design to some extent.
- #### Link to Github: https://github.com/d7hernan - #### Link to Github: https://github.com/d7hernan
### **Henry Feng** ### **Henry Feng**
- #### About Me: - #### About Me:
- My name is Henry, and I am a 3rd year CS major. I was born in China and grew up in New Zealand. I wrote my first line of code, in Python during my second year of high school. My favourite foods are ramen, steak and pasta. Some of my hobbies include playing guitar, hiking, cooking, video games, and music (from the Persona series). I am excited to start this project and hope to contribute to both frontend and backend. - My name is Henry, and I am a 3rd year CS major. I was born in China and grew up in New Zealand. I wrote my first line of code, in Python during my second year of high school. My favourite foods are ramen, steak and pasta. Some of my hobbies include playing guitar, hiking, cooking, video games, and music (from the Persona series). I am excited to start this project and hope to contribute to both frontend and backend.
- #### Link to Github: https://github.com/dusk-moon - #### Link to Github: https://github.com/dusk-moon
### **Kara Hoagland** ### **Kara Hoagland**
- #### About Me: - #### About Me:
- My name is Kara Hoagland and I am a 3rd year Computer Engineering major. CS-wise, I'm interested in topics such as computer vision and RFID, but it's hard to limit oneself because there's so many interesting topics out there. Outside of CS, I enjoy D&D, biking, and reading. I got some industry experience over summer and love getting to see how that experience and my previous classes all apply to this project. I'm interested in full stack but more so the backend of things. - My name is Kara Hoagland and I am a 3rd year Computer Engineering major. CS-wise, I'm interested in topics such as computer vision and RFID, but it's hard to limit oneself because there's so many interesting topics out there. Outside of CS, I enjoy D&D, biking, and reading. I got some industry experience over summer and love getting to see how that experience and my previous classes all apply to this project. I'm interested in full stack but more so the backend of things.
- #### Link to Github: https://github.com/KH-Cl - #### Link to Github: https://github.com/KH-Cl
### **Marc Reta** ### **Marc Reta**
- #### About Me: My name is Marc Reta and I am a 3rd year Computer Engineering major in Warren College. I love exploring San Diego and going on adventures. I have a huge interest in Public Transportation. I'm looking foward to working with everyone in my group and learn how to create an application. - #### About Me: My name is Marc Reta and I am a 3rd year Computer Engineering major in Warren College. I love exploring San Diego and going on adventures. I have a huge interest in Public Transportation. I'm looking foward to working with everyone in my group and learn how to create an application.
- #### Link to Github: https://github.com/Graydogminer - #### Link to Github: https://github.com/Graydogminer
### **Sanjit Joseph** ### **Sanjit Joseph**
- #### About Me: - #### About Me:
- Hi! My name is Sanjit Joseph and I'm a 3rd year CE major at Sixth. I'm from the Bay Area, so I've been surrounded by technology most of my life. I'm into building computers and I waste a lot of time (and money) messing with my PC and playing video games on it. I enjoy things outside of tech, though--as an Eagle Scout, I've done tons of backpacking throughout California and the US. I also hold a black belt in Shotokan Karate. As for this class, I'm pretty excited about all the different aspects of software engineering; frontend and backend both appeal to me, but I'm really just excited to work on a long class project in a team setting. - Hi! My name is Sanjit Joseph and I'm a 3rd year CE major at Sixth. I'm from the Bay Area, so I've been surrounded by technology most of my life. I'm into building computers and I waste a lot of time (and money) messing with my PC and playing video games on it. I enjoy things outside of tech, though--as an Eagle Scout, I've done tons of backpacking throughout California and the US. I also hold a black belt in Shotokan Karate. As for this class, I'm pretty excited about all the different aspects of software engineering; frontend and backend both appeal to me, but I'm really just excited to work on a long class project in a team setting.
- #### Link to Github: https://github.com/sm-joseph - #### Link to Github: https://github.com/sm-joseph
### **Isaac Otero** ### **Isaac Otero**
- #### About Me: - #### About Me:
- My name is Isaac Otero, I am a 5th year Cog Sci major. I am interested in front end development. I want to implement what Ive learned from my design classes into my projects for front end development. - My name is Isaac Otero, I am a 5th year Cog Sci major. I am interested in front end development. I want to implement what Ive learned from my design classes into my projects for front end development.
- #### Link to Github: https://github.com/Isaac-Otero - #### Link to Github: https://github.com/Isaac-Otero
### **Arthur Lu** ### **Arthur Lu**
- #### About Me: - #### About Me:
- My name is Arthur Lu and I am a 3rd year CE major. I am primarily interested in low level systems design, hardware development and optimization, and HPC architecture. I work as an undergraduate research assistant for Prof. Turakhia developing hardware accelerators for long length genome alignment. When Im not busy, I like to relax with some retro video games. - My name is Arthur Lu and I am a 3rd year CE major. I am primarily interested in low level systems design, hardware development and optimization, and HPC architecture. I work as an undergraduate research assistant for Prof. Turakhia developing hardware accelerators for long length genome alignment. When Im not busy, I like to relax with some retro video games.
- #### Link to Github: https://github.com/ltcptgeneral - #### Link to Github: https://github.com/ltcptgeneral

View File

@ -1,13 +1,20 @@
{ {
"name": "food-journal", "name": "food-journal",
"version": "1.0.0", "version": "1.0.0",
"type": "module",
"scripts": { "scripts": {
"test": "mocha --recursive './{,!(node_modules)/**}/*.test.js'", "test": "mocha --recursive --require mock-local-storage './{,!(node_modules)/**}/*.test.js'",
"lint": "eslint '**/*.js'", "lint": "eslint '**/*.js'",
"fix-style": "eslint --fix **/*.js" "fix-style": "eslint --fix **/*.js",
"lintHTML": "htmlhint '**/*.html'",
"lintCSS": "stylelint '**/*.css'"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^8.27.0", "eslint": "^8.27.0",
"mocha": "10" "htmlhint": "1.1.4",
"mocha": "10",
"mock-local-storage": "^1.1.23",
"stylelint": "14.14.1",
"stylelint-config-standard": "^29.0.0"
} }
} }

77
source/CreatePage.html Normal file
View File

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Food Journal</title>
<!-- Recipe Card Custom Element -->
<script src="assets/scripts/ReviewCard.js" type="module"></script>
<!-- Main Stylesheets & Scripts -->
<!-- Temporarily commented out reset.css due to furthur discussion needed on the values of the default config-->
<!-- <link rel="stylesheet" href="/static/reset.css" /> -->
<link rel="stylesheet" href="./static/CreatePage.css" />
<script src="assets/scripts/main.js" type="module"></script>
</head>
<body>
<form id="new-food-entry">
<fieldset>
<legend>Pic:</legend>
<label for="mealImage">
Source:
<input type="text" id="mealImg" name="mealImg">
</label>
<label for="image-alt">
Alt Text:
<input type="text" id="imgAlt" name="imgAlt">
</label>
</fieldset>
<fieldset>
<legend> Meal: </legend>
<label for="Meal: ">Meal:
<input type="text" id="mealName" name="mealName" required>
</label>
<label for="comments">Comments:
<br>
<textarea name="comments" id="comments"></textarea>
</label>
</fieldset>
<fieldset class="rating">
<legend> Rating: </legend>
<input type="radio" id="s5" name="rating" value="5"/> <label for="s5"> 5 stars </label>
<input type="radio" id="s4" name="rating" value="4"/> <label for="s4"> 4 stars </label>
<input type="radio" id="s3" name="rating" value="3"/> <label for="s3"> 3 stars </label>
<input type="radio" id="s2" name="rating" value="2"/> <label for="s2"> 2 stars </label>
<input type="radio" id="s1" name="rating" value="1"/> <label for="s1"> 1 star </label>
</fieldset>
<fieldset>
<legend>Other Info:</legend>
<label for="restaurant">
Restaurant:
<input type="text" id="restaurant" name="restaurant" required>
</label>
<label for="tag-form">
Tags:
<input type="text" id="tag-form" name="tag-form">
<div class='tag-container' id="tag-container-form">
</div>
<button type="button" id="tagAdd">Add Tag</button>
</label>
</fieldset>
<button type="submit" value="Submit">Add Review</button>
<button type="button" class="danger">Clear Review Journal</button>
</form>
</body>
</html>

77
source/ReviewDetails.html Normal file
View File

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Food Journal</title>
<!-- Recipe Card Custom Element -->
<script src="assets/scripts/ReviewCard.js" type="module"></script>
<!-- Main Stylesheets & Scripts -->
<!-- Temporarily commented out reset.css due to furthur discussion needed on the values of the default config-->
<!-- <link rel="stylesheet" href="/static/reset.css" /> -->
<link rel="stylesheet" href="./static/ReviewCard.css" />
<script src="assets/scripts/ReviewDetails.js" type="module"></script>
</head>
<body>
<main>
<button type="button" id="update">Update</button>
<button type="button" id="delete" class="danger">Delete</button>
</main>
<!----> <form id="update-food-entry" class="hidden">
<fieldset>
<legend>Pic:</legend>
<label for="mealImage">
Source:
<input type="text" id="mealImg" name="mealImg">
</label>
<label for="image-alt">
Alt Text:
<input type="text" id="imgAlt" name="imgAlt">
</label>
</fieldset>
<fieldset>
<legend> Meal: </legend>
<label for="Meal: ">Meal:
<input type="text" id="mealName" name="mealName" required>
</label>
<label for="comments">Comments:
<br>
<textarea name="comments" id="comments"></textarea>
</label>
</fieldset>
<fieldset class="rating">
<legend> Rating: </legend>
<input type="radio" id="s5" name="rating" value="5"/> <label for="s5"> 5 stars </label>
<input type="radio" id="s4" name="rating" value="4"/> <label for="s4"> 4 stars </label>
<input type="radio" id="s3" name="rating" value="3"/> <label for="s3"> 3 stars </label>
<input type="radio" id="s2" name="rating" value="2"/> <label for="s2"> 2 stars </label>
<input type="radio" id="s1" name="rating" value="1"/> <label for="s1"> 1 star </label>
</fieldset>
<fieldset>
<legend>Other Info:</legend>
<label for="restaurant">
Restaurant:
<input type="text" id="restaurant" name="restaurant" required>
</label>
<label for="tag-form">
Tags:
<input type="text" id="tag-form" name="tag-form">
<div class='tag-container' id="tag-container-form">
</div>
<button type="button" id="tagAdd">Add Tag</button>
</label>
</fieldset>
<button type="submit" value="Submit">Add Review</button>
</form>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#dadce0;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/><path class="cls-1" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/><path class="cls-1" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/><path class="cls-1" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#febc17;}.cls-2{fill:#dadce0;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/><path class="cls-2" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/><path class="cls-2" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/><path class="cls-2" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/><path class="cls-2" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#febc17;}.cls-2{fill:#dadce0;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/><path class="cls-1" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/><path class="cls-2" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/><path class="cls-2" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/><path class="cls-2" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#febc17;}.cls-2{fill:#dadce0;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/><path class="cls-1" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/><path class="cls-1" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/><path class="cls-2" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/><path class="cls-2" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#febc17;}.cls-2{fill:#dadce0;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/><path class="cls-1" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/><path class="cls-1" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/><path class="cls-1" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/><path class="cls-2" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 157.02 27.59"><defs><style>.cls-1{fill:#febc17;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M14.51,0,11.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H17.94"/><path class="cls-1" d="M46.51,0,43.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H49.94"/><path class="cls-1" d="M78.51,0,75.09,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H81.94"/><path class="cls-1" d="M110.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H113.94"/><path class="cls-1" d="M142.51,0l-3.42,10.53c-3.66,0-7.61,0-11.09,0l9,6.51c-1.12,3.47-2.35,7.24-3.42,10.54,2.87-2.1,5.92-4.3,9-6.51l9,6.51c-1.12-3.41-2.26-6.95-3.42-10.54l9-6.51H145.94"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

View File

@ -0,0 +1,270 @@
// ReviewCard.js
class ReviewCard extends HTMLElement {
// Called once when document.createElement('review-card') is called, or
// the element is written into the DOM directly as <review-card>
constructor() {
super();
let shadowEl = this.attachShadow({mode:"open"});
let articleEl = document.createElement("article");
let styleEl = document.createElement("style");
styleEl.textContent = `
* {
font-family: sans-serif;
margin: 0;
padding: 0;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
article {
align-items: center;
border: 1px solid rgb(223, 225, 229);
border-radius: 8px;
display: grid;
grid-template-rows: 118px 56px 14px 18px 15px 36px;
height: auto;
row-gap: 5px;
padding: 0 16px 16px 16px;
width: 178px;
}
div.rating {
align-items: center;
column-gap: 5px;
display: flex;
}
div.rating>img {
height: auto;
display: inline-block;
object-fit: scale-down;
width: 78px;
}
article>img {
border-top-left-radius: 8px;
border-top-right-radius: 8px;
height: 118px;
object-fit: cover;
margin-left: -16px;
width: calc(100% + 32px);
}
label.restaurant-name {
color: black !important;
}
label.meal-name {
display: -webkit-box;
font-size: 16px;
height: 36px;
line-height: 18px;
overflow: hidden;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
label:not(.meal-name),
span,
time {
color: #70757A;
font-size: 12px;
}
`;
articleEl.append(styleEl);
shadowEl.append(articleEl);
this.shadowEl = shadowEl;
//attach event listener to each recipe-card
this.addEventListener("click", (event) => {
console.log(event.target);
console.log(event.target.data);
//Option 1: sending current data to second html page using localStorage (could also just store index)
sessionStorage.setItem("current", JSON.stringify(event.target.data));
window.location.assign("./ReviewDetails.html");
/*
//Option 2: sending current data to second html page using string query w/ url (currently not storing value)
let reviewFields = window.location.search.slice(1).split("&");
for(let i = 0; i < reviewFields.length; i++) {
let kv = reviewFields[i].split("=");
let key = kv[0];
let value = kv[1];
console.log(key);
console.log(value);
// What you want to do with name and value...
}*/
});
}
/**
* Called when the .data property is set on this element.
*
* For Example:
* let reviewCard = document.createElement('review-card');
* reviewCard.data = { foo: 'bar' }
*
* @param {Object} data - The data to pass into the <review-card>, must be of the
* following format:
* {
* "mealImg": "string",
* "imgAlt": "string",
* "mealName": "string",
* "comments": "string",
* "rating": number,
* "restaurant": "string",
* "tags": string array
* }
*/
set data(data) {
// If nothing was passed in, return
if (!data) return;
// Select the <article> we added to the Shadow DOM in the constructor
let articleEl = this.shadowEl.querySelector("article");
// setting the article elements for the review card
//image setup
let mealImg = document.createElement("img");
mealImg.setAttribute("id", "a-mealImg");
mealImg.setAttribute("src",data["mealImg"]);
mealImg.setAttribute("alt",data["imgAlt"]);
//meal name setup
let mealLabel = document.createElement("label");
mealLabel.setAttribute("id", "a-mealName");
mealLabel.setAttribute("class","meal-name");
mealLabel.innerHTML = data["mealName"];
//restaurant name setup
/*
//review page link
//giving it functionality to save the review card's info to session storage for loading the review page
let reviewLink = document.createElement('a');
reviewLink.setAttribute('href','./review.html')
reviewLink.innerHTML = 'review page'
reviewLink.addEventListener('click', () => {
sessionStorage.clear();
let currReview = {
"imgSrc": data['imgSrc'],
"imgAlt": data['imgAlt'],
"mealName": data['mealName'],
"restaurant": data['restaurant'],
"comments": data['comments'],
"rating": data['rating'],
"tags": data['tags']
}
sessionStorage.setItem('currReview', JSON.stringify(currReview));
});
*/
let restaurantLabel = document.createElement("label");
restaurantLabel.setAttribute("id", "a-restaurant");
restaurantLabel.setAttribute("class","restaurant-name");
restaurantLabel.innerHTML = data["restaurant"];
//comment section setup (display set to none)
let comments = document.createElement("p");
comments.setAttribute("id", "a-comments");
comments.style.display = "none";
comments.innerText = data["comments"];
//other info: rating
let ratingDiv = document.createElement("div");
ratingDiv.setAttribute("class", "rating");
let starsImg = document.createElement("img");
starsImg.setAttribute("id", "a-rating");
starsImg.setAttribute("src", "./assets/images/icons/"+data["rating"]+"-star.svg");
starsImg.setAttribute("alt", data["rating"] +" stars");
starsImg.setAttribute("num", data["rating"]);
ratingDiv.append(starsImg);
//added tags
let tagContainer = document.createElement("div");
tagContainer.setAttribute("class", "tag-container");
tagContainer.setAttribute("id", "a-tags");
tagContainer.setAttribute("list", data["tags"]);
if(data["tags"]){
for (let i = 0; i < data["tags"].length; i++) {
let newTag = document.createElement("label");
newTag.setAttribute("class","tag");
newTag.innerHTML = data["tags"][i] + " ";
tagContainer.append(newTag);
}
}
articleEl.append(mealImg);
articleEl.append(mealLabel);
//articleEl.append(reviewLink)
articleEl.append(restaurantLabel);
articleEl.append(ratingDiv);
articleEl.append(tagContainer);
articleEl.append(comments);
}
/**
* Called when getting the .data property of this element.
*
* For Example:
* let reviewCard = document.createElement('review-card');
* reviewCard.data = { foo: 'bar' }
*
* @return {Object} data - The data from the <review-card>, of the
* following format:
* {
* "mealImg": "string",
* "imgAlt": "string",
* "mealName": "string",
* "comments": "string",
* "rating": number,
* "restaurant": "string",
* "tags": string array
* }
*/
get data() {
let dataContainer = {};
// getting the article elements for the review card
//get image
let mealImg = this.shadowEl.getElementById("a-mealImg");
dataContainer["mealImg"] = mealImg.getAttribute("src");
dataContainer["imgAlt"] = mealImg.getAttribute("alt");
//get meal name
let mealLabel = this.shadowEl.getElementById("a-mealName");
dataContainer["mealName"] = mealLabel.innerHTML;
//get comment section
let comments = this.shadowEl.getElementById("a-comments");
console.log(comments);
dataContainer["comments"] = comments.innerText;
//get other info: rating
let starsImg = this.shadowEl.getElementById("a-rating");
dataContainer["rating"] = starsImg.getAttribute("num");
//get restaurant name
let restaurantLabel = this.shadowEl.getElementById("a-restaurant");
dataContainer["restaurant"] = restaurantLabel.innerHTML;
//get tags
let tagContainer = this.shadowEl.getElementById("a-tags");
dataContainer["tags"] = tagContainer.getAttribute("list").split(",");
return dataContainer;
}
}
customElements.define("review-card", ReviewCard);

View File

@ -0,0 +1,124 @@
//reviewDetails.js
import {getReviewsFromStorage, saveReviewsToStorage} from "./localStorage.js";
// Run the init() function when the page has loaded
window.addEventListener("DOMContentLoaded", init);
function init(){
setupDelete();
setupUpdate();
}
function setupDelete(){
let deleteBtn = document.getElementById("delete");
let reviews = getReviewsFromStorage();
let current = JSON.parse(sessionStorage.getItem("current"));
deleteBtn.addEventListener("click", function(){
if(window.confirm("Are you sure you want to delete this entry?")){
//delete function
if(current){
console.log(current);
for(let i = 0; i < reviews.length; i++){
console.log(reviews[i]);
if(reviews[i]["mealName"] == current["mealName"] && reviews[i]["restaurant"] == current["restaurant"]){
console.log("match found");
reviews.splice(i,1);
saveReviewsToStorage(reviews);
sessionStorage.removeItem("current");
window.location.assign("./index.html");
break;
}
}
}
}
});
}
function setupUpdate(){
let updateBtn = document.getElementById("update");
let reviews = getReviewsFromStorage();
let current = JSON.parse(sessionStorage.getItem("current"));
let form = document.getElementById("update-food-entry");
updateBtn.addEventListener("click", function(){
//update function
if(current){
console.log(current);
form.style.display = "block";
let tagContainer = document.getElementById("tag-container-form");
console.log(document.querySelectorAll("#update-food-entry input"));
//Set value of each input element to current's values
document.getElementById("mealImg").defaultValue = current["mealImg"];
document.getElementById("imgAlt").defaultValue = current["imgAlt"];
document.getElementById("mealName").defaultValue = current["mealName"];
document.getElementById("comments").textContent = current["comments"];
document.getElementById("rating-" + `${current["rating"]}`).checked = true;
document.getElementById("restaurant").defaultValue = current["restaurant"];
if(current["tags"]){
for (let i = 0; i < current["tags"].length; i++) {
let newTag = document.createElement("label");
newTag.setAttribute("class","tag");
newTag.innerHTML = current["tags"][i] + " ";
newTag.addEventListener("click",()=> {
tagContainer.removeChild(newTag);
});
tagContainer.append(newTag);
}
}
//Take formdata values as newData when submit
form.addEventListener("submit", function(){
/*
* User submits the form for their review.
* We create reviewCard and put in storage
*/
let formData = new FormData(form);
let newData = {};
for (let [key, value] of formData) {
console.log(`${key}`);
console.log(`${value}`);
if (`${key}` !== "tag-form") {
newData[`${key}`] = `${value}`;
}
}
newData["tags"] = [];
let tags = document.querySelectorAll(".tag");
for(let i = 0; i < tags.length; i ++) {
newData["tags"].push(tags[i].innerHTML);
tagContainer.removeChild(tags[i]);
}
for(let i = 0; i < reviews.length; i++){
console.log(reviews[i]);
if(reviews[i]["mealName"] == current["mealName"] && reviews[i]["restaurant"] == current["restaurant"]){
console.log("match found");
reviews.splice(i,1,newData);
saveReviewsToStorage(reviews);
sessionStorage.setItem("current", JSON.stringify(newData));
break;
}
}
form.style.display = "none";
});
let tagAddBtn = document.getElementById("tagAdd");
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);
tagField.value = "";
}
});
}
});
}

View File

@ -0,0 +1,13 @@
// Run the init() function when the page has loaded
window.addEventListener("DOMContentLoaded", init);
function init() {
let result = sessionStorage.getItem("currReview");
let main = document.querySelector("main");
main.innerHTML = result;
let p = document.createElement("p");
p.innerHTML = JSON.parse(result)["comments"];
main.append(p);
}

View File

@ -0,0 +1,19 @@
/**
* @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));
}

View File

@ -0,0 +1,48 @@
import {strict as assert} from "node:assert";
import {describe, it, beforeEach} from "mocha";
import {saveReviewsToStorage, getReviewsFromStorage} from "./localStorage.js";
beforeEach(() => {
localStorage.clear();
});
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", () => {
let 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);
}
}).timeout(10000);
});

View File

@ -0,0 +1,119 @@
// main.js
import {getReviewsFromStorage, saveReviewsToStorage} from "./localStorage.js";
// Run the init() function when the page has loaded
window.addEventListener("DOMContentLoaded", init);
function init() {
// Get the reviews from localStorage
let reviews = getReviewsFromStorage();
// Add each reviews to the <main> element
addReviewsToDocument(reviews);
// Add the event listeners to the form elements
initFormHandler();
}
/**
* @param {Array<Object>} reviews An array of reviews
*/
function addReviewsToDocument(reviews) {
let mainEl = document.querySelector("main");
reviews.forEach(review => {
let newReview = document.createElement("review-card");
newReview.data = review;
//TODO: want to append it to whatever the box is in layout
mainEl.append(newReview);
});
}
/**
* Adds the necessary event handlers to <form> and the clear storage
* <button>.
*/
function initFormHandler() {
/*
//btn to create form (could be its own function?)
let createBtn = document.getElementById("create");
createBtn.addEventListener("click", function(){
window.location.assign("./CreatePage.html");
});*/
//accessing form components
let tagContainer = document.getElementById("tag-container-form");
let form = document.querySelector("form");
form.addEventListener("submit", function(){
/*
* User submits the form for their review.
* We create reviewCard and put in storage
*/
let formData = new FormData(form);
let reviewObject = {};
for (let [key, value] of formData) {
console.log(`${key}`);
console.log(`${value}`);
if (`${key}` !== "tag-form") {
reviewObject[`${key}`] = `${value}`;
}
}
reviewObject["tags"] = [];
let tags = document.querySelectorAll(".tag");
for(let i = 0; i < tags.length; i ++) {
reviewObject["tags"].push(tags[i].innerHTML);
tagContainer.removeChild(tags[i]);
}
let newReview = document.createElement("review-card");
newReview.data = reviewObject;
//TODO: want to append it to whatever the box is in layout
let mainEl = document.querySelector("main");
mainEl.append(newReview);
let storedReviews = getReviewsFromStorage();
storedReviews.push(reviewObject);
saveReviewsToStorage(storedReviews);
document.getElementById("new-food-entry").reset();
});
// DEV-MODE: for testing purposes
let clearBtn = document.querySelector(".danger");
clearBtn.addEventListener("click", function() {
localStorage.clear();
let mainEl = document.querySelector("main");
while (mainEl.firstChild) {
mainEl.removeChild(mainEl.firstChild);
}
let deleteTags = document.querySelectorAll(".tag");
for(let i = 0; i < deleteTags.length; i ++) {
tagContainer.removeChild(deleteTags[i]);
}
//clears reviews AS WELL as resets form
document.getElementById("new-food-entry").reset();
});
let tagAddBtn = document.getElementById("tagAdd");
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);
tagField.value = "";
}
});
}

79
source/index.html Normal file
View File

@ -0,0 +1,79 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Food Journal</title>
<!-- Recipe Card Custom Element -->
<script src="assets/scripts/ReviewCard.js" type="module"></script>
<!-- Main Stylesheets & Scripts -->
<!-- Temporarily commented out reset.css due to furthur discussion needed on the values of the default config-->
<!-- <link rel="stylesheet" href="/static/reset.css" /> -->
<link rel="stylesheet" href="./static/ReviewCard.css" />
<script src="assets/scripts/main.js" type="module"></script>
</head>
<body>
<main>
<!-- Add Food Entries Here -->
</main>
<!--<button type="button" id="create">CREATE</button>-->
<!----> <form id="new-food-entry">
<fieldset>
<legend>Pic:</legend>
<label for="mealImage">
Source:
<input type="text" id="mealImg" name="mealImg">
</label>
<label for="image-alt">
Alt Text:
<input type="text" id="imgAlt" name="imgAlt">
</label>
</fieldset>
<fieldset>
<legend> Meal: </legend>
<label for="Meal: ">Meal:
<input type="text" id="mealName" name="mealName" required>
</label>
<label for="comments">Comments:
<br>
<textarea name="comments" id="comments"></textarea>
</label>
</fieldset>
<fieldset class="rating">
<legend> Rating: </legend>
<input type="radio" id="s5" name="rating" value="5"/> <label for="s5"> 5 stars </label>
<input type="radio" id="s4" name="rating" value="4"/> <label for="s4"> 4 stars </label>
<input type="radio" id="s3" name="rating" value="3"/> <label for="s3"> 3 stars </label>
<input type="radio" id="s2" name="rating" value="2"/> <label for="s2"> 2 stars </label>
<input type="radio" id="s1" name="rating" value="1"/> <label for="s1"> 1 star </label>
</fieldset>
<fieldset>
<legend>Other Info:</legend>
<label for="restaurant">
Restaurant:
<input type="text" id="restaurant" name="restaurant" required>
</label>
<label for="tag-form">
Tags:
<input type="text" id="tag-form" name="tag-form">
<div class='tag-container' id="tag-container-form">
</div>
<button type="button" id="tagAdd">Add Tag</button>
</label>
</fieldset>
<button type="submit" value="Submit">Add Review</button>
<button type="button" class="danger">Clear Review Journal</button>
</form> <!---->
</body>
</html>

16
source/review.html Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Food Journal</title>
<script src="assets/scripts/reviewpage.js" type="module"></script>
</head>
<body>
<h1>Current Review:</h1>
<main>
</main>
</body>
</html>

19
source/reviews.json Normal file
View File

@ -0,0 +1,19 @@
[
{
"imgSrc": "https://cdn.vox-cdn.com/thumbor/Cj5J-5WqSCjlC2tWCOXEB536CJY=/0x0:1810x1182/1200x800/filters:focal(761x447:1049x735)/cdn.vox-cdn.com/uploads/chorus_image/image/69422966/Tacos_Lined_Up.0.png",
"imgAlt": "tacos pic",
"mealName": "Birria Tacos",
"restaurant": "Mike's Red Tacos",
"rating": 5,
"tags": ["delicious", "#worthit","omg"]
},
{
"imgSrc": "https://www.redwormcomposting.com/images/worm-burrito.JPG",
"imgAlt": "wolftown pic",
"mealName": "Carnitas Burrito",
"restaurant": "Wolftown UCSD",
"rating": 0,
"tags": ["gross", "why","no"]
}
]

View File

View File

@ -0,0 +1,83 @@
/* CreatePage.css */
* {
font-family: sans-serif;
}
body {
height: 100%;
width: 100%;
}
fieldset {
border: 2px solid rgb(214 214 214);
box-sizing: border-box;
display: block;
width: max-content;
}
form button {
display: block;
margin-top: 5px;
}
label[for="ingredients"] p {
margin: 0;
}
label[for="numRatings"] {
margin: 10px 0 0;
}
label[for^="rating"] {
padding-right: 10px;
}
label:not([for^="rating"]) {
display: block;
margin-bottom: 5px;
}
main {
column-gap: 10px;
display: flex;
flex-wrap: wrap;
height: auto;
max-width: 660px;
row-gap: 10px;
width: 100%;
}
.tag-container {
display: flex;
flex-flow: row wrap;
}
.tag {
background-color: grey;
border-radius: 7px;
color: white;
padding-right: 7px;
padding-left: 7px;
margin: 3px;
}
.tag::before {
display: inline-block;
content: "x";
height: 15px;
width: 15px;
margin-right: 4px;
text-align: center;
color: white;
cursor: pointer;
}
.tag:hover::before {
color: red;
}
.danger {
background-color: rgb(254 171 171);
border-color: red;
}

View File

@ -0,0 +1,83 @@
/* main.css */
* {
font-family: sans-serif;
}
body {
height: 100%;
width: 100%;
}
fieldset {
border: 2px solid rgb(214 214 214);
box-sizing: border-box;
display: block;
width: max-content;
}
form button {
display: block;
margin-top: 5px;
}
label[for="ingredients"] p {
margin: 0;
}
label[for="numRatings"] {
margin: 10px 0 0;
}
label[for^="rating"] {
padding-right: 10px;
}
label:not([for^="rating"]) {
display: block;
margin-bottom: 5px;
}
main {
column-gap: 10px;
display: flex;
flex-wrap: wrap;
height: auto;
max-width: 660px;
row-gap: 10px;
width: 100%;
}
.tag-container {
display: flex;
flex-flow: row wrap;
}
.tag {
background-color: grey;
border-radius: 7px;
color: white;
padding-right: 7px;
padding-left: 7px;
margin: 3px;
}
.tag::before {
display: inline-block;
content: "x";
height: 15px;
width: 15px;
margin-right: 4px;
text-align: center;
color: white;
cursor: pointer;
}
.tag:hover::before {
color: red;
}
.danger {
background-color: rgb(254 171 171);
border-color: red;
}

158
source/static/reset.css Normal file
View File

@ -0,0 +1,158 @@
/* This is a generic CSS file that sets preliminary rules for content that should be the same across pages */
html,
body,
div,
span,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
abbr,
address,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
samp,
small,
strong,
sub,
sup,
var,
b,
i,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
nav ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote::before,
blockquote::after,
q::before,
q::after {
content: "";
content: none;
}
a {
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
input,
select {
vertical-align: middle;
}
img,
fieldset,
object {
border: none;
}
*,
*::after,
*::before {
box-sizing: border-box;
}
button,
label {
cursor: pointer;
}
html,
body {
height: 100%;
}
form {
border: solid;
}

View File

@ -0,0 +1,19 @@
# Use Stylelint for CSS linting framework
- Status: accept
- Deciders: Arthur Lu, Marc Reta
- Date: 11 / 14 / 22
## Decision Drivers
- Need linting to work with multiple style standards
- Need linting to be fast and informative
## Considered Options
- Stylelint
- Prettier
## Decision Outcome
Chosen Option: Stylelint for its easy installation and unopinionated.

View File

@ -0,0 +1,19 @@
# Use HTMLhint for HTML linting framework
- Status: accept
- Deciders: Arthur Lu, Marc Reta
- Date: 11 / 14 / 22
## Decision Drivers
- Need linting to work with multiple style standards
- Need linting to be fast and informative
## Considered Options
- HTMLhint
- HTML-validate
## Decision Outcome
Chosen Option: HTMLhint for its low configuration complexity.

View File

@ -1,2 +1,2 @@
# Overarching Decisions # Overarching Decisions
_We will eventually capture these as an ADR in markdown Links to an external site.(/specs/adrs will contain an individual document per major decision. There will be some initial ones that have to do with general project plan and approach, but more may be added as the project goes on. The main point of this capture is to explain why choices are made. As brainstorming may have your team settle on choices quickly capturing them in a document may be better than just mental consensus)_ _We will eventually capture these as an ADR in markdown Links to an external site.(/specs/adrs will contain an individual document per major decision. There will be some initial ones that have to do with general project plan and approach, but more may be added as the project goes on. The main point of this capture is to explain why choices are made. As brainstorming may have your team settle on choices quickly capturing them in a document may be better than just mental consensus)_

View File

@ -1,82 +0,0 @@
/* This is a generic CSS file that sets preliminary rules for content that should be the same across pages */
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
article,aside,details,figcaption,figure,
footer,header,hgroup,menu,nav,section {
display: block;
}
nav ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
a {
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
input, select {
vertical-align :middle;
}
img, fieldset, object {
border:none;
}
*, *:after, *:before {
box-sizing:border-box;
}
button, label {
cursor:pointer;
}
html, body {
height:100%;
}
form {
border
}

View File

@ -1,28 +0,0 @@
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;
}

View File

@ -1,81 +0,0 @@
const {environment} = require("./testenv.js");
var assert = require("assert");
var {describe, it, beforeEach} = require("mocha");
var {saveToLocal, getFromLocal, removeFromLocal, clearLocal} = require("./testenv_helpers");
beforeEach(() => {
window = environment();
});
describe("test localStorage mock", () => {
it("test save and fetch", () => {
saveToLocal("testkey1", "testvalue1");
saveToLocal("testkey2", "testvalue2");
saveToLocal("testkey3", "testvalue3");
saveToLocal("testkey4", "testvalue4");
assert.equal(getFromLocal("testkey1"), "testvalue1");
assert.equal(getFromLocal("testkey2"), "testvalue2");
assert.equal(getFromLocal("testkey3"), "testvalue3");
assert.equal(getFromLocal("testkey4"), "testvalue4");
saveToLocal("testkey6", "testvalue5");
assert.equal(getFromLocal("testkey6"), "testvalue5");
});
it("test window locality", () => {
assert.equal(getFromLocal("testkey1"), null);
assert.equal(getFromLocal("testkey2"), null);
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), null);
});
it("test delete and fetch", () => {
saveToLocal("testkey1", "testvalue1");
saveToLocal("testkey2", "testvalue2");
saveToLocal("testkey3", "testvalue3");
saveToLocal("testkey4", "testvalue4");
removeFromLocal("testkey3");
assert.equal(getFromLocal("testkey1"), "testvalue1");
assert.equal(getFromLocal("testkey2"), "testvalue2");
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), "testvalue4");
removeFromLocal("testkey1");
assert.equal(getFromLocal("testkey1"), null);
assert.equal(getFromLocal("testkey2"), "testvalue2");
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), "testvalue4");
removeFromLocal("testkey4");
assert.equal(getFromLocal("testkey1"), null);
assert.equal(getFromLocal("testkey2"), "testvalue2");
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), null);
removeFromLocal("testkey2");
assert.equal(getFromLocal("testkey1"), null);
assert.equal(getFromLocal("testkey2"), null);
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), null);
});
it("test clear and fetch", () => {
saveToLocal("testkey1", "testvalue1");
saveToLocal("testkey2", "testvalue2");
saveToLocal("testkey3", "testvalue3");
saveToLocal("testkey4", "testvalue4");
clearLocal();
assert.equal(getFromLocal("testkey1"), null);
assert.equal(getFromLocal("testkey2"), null);
assert.equal(getFromLocal("testkey3"), null);
assert.equal(getFromLocal("testkey4"), null);
});
});

View File

@ -1,17 +0,0 @@
module.exports = {saveToLocal, getFromLocal, removeFromLocal, clearLocal};
function saveToLocal (k, v) {
window.localStorage.setItem(k, v);
}
function getFromLocal (k) {
return window.localStorage.getItem(k);
}
function removeFromLocal (k) {
window.localStorage.removeItem(k);
}
function clearLocal () {
window.localStorage.clear();
}